ファイルのテキストを置き換える方法 - 条件と算術が必要

ファイルのテキストを置き換える方法 - 条件と算術が必要

一部のテキストファイルの内容を変更するにはスクリプトが必要です。これは私の限られたbash技術を少し超えています。 PerlやPythonはより良いアプローチかもしれませんが、どちらの経験もありません。

レポートで生成されたテキストファイルがたくさんあります。一部のファイルにエラーが含まれているため、エラー列を$ 0.00の通貨値に置き換える必要があります。新しい値は、同じファイルに報告されている他の値の2倍でなければなりません。

変更する必要があるファイル名には、「Summary」という単語が含まれています。ファイル名に「Summary」がない場合は、ファイルを無視する必要があります。

これらのファイルには、「カテゴリXコスト価格:$ 0.00」行が含まれています。ここで、Xは数値です。 $ 0.00は、Xが0(ゼロ)の場合にのみ置き換える必要があり、Xの他の値はファイルを無視する必要があります。 「Category 0 Cost Price: $0.00」という文字列が存在することを確認して、これを識別したいと思います。

「カテゴリ」で始まる他の行はここでは重要ではなく、無視する必要があります(たとえば、「カテゴリX販売価格:$ 0.00」、他の行も存在します)。

ここでは、「カテゴリXコスト価格:$ 0.00」のみが重要です。この行の値は常に$ 0.00で、Xが0の場合にのみ変更できます。

新しい値は、「コスト」値に2を掛けた値です。

以下の例とは異なり、関心のある行は特定の行番号に固定されていません。 「コスト」が常に2行目にあるわけではなく、「カテゴリXコスト価格」が常に4行目にあるわけではありません。

例:

ファイル:1234 abstract.text

Some data
Cost: $15.73
Line of data
Category 0 cost price: $0.00,
Category 0 sale price: $0.00,
Category 4 list price: $44.95,
More data

「カテゴリー

ファイルの変更:1234 Summary.text

Some data
Cost: $15.73
Line of data
Category 0 cost price: $31.46,
Category 0 sale price: $0.00,
Category 4 list price: $44.95,
More data

ファイル:2468 abstract.text

Some data
Cost: $1.32
Line of data
Category 12 cost price: $0.00,
Category 5 sale price: $4.75,
Category 0 list price: $4.75,
More data

カテゴリー


要約するには、「Summary」という単語を含むファイル名を繰り返し、「Category 0 Price:$ 0.00」文字列がある場合は、「0.00」を「Cost:$ X.XX」行の2倍の値に置き換えます。それ以外の場合、ファイルは無視されます。

変更されたファイルのリストも必要です。別のテキストファイルにファイル名を追加することをお勧めします。

ベストアンサー1

これTXR不明瞭な音声解決策は私にとって効果的でした。

#;コメント記号を使用して、(rename-path ...)各一時ファイルの名前を元の名前に戻す式を無効にします。ファイルの内容が問題ない場合は、#;記号を削除して内部交換を有効にしてください.tmp.tmp変更がない場合は、ファイルを削除することをお勧めします。

(each ((file (glob "*Summary.txt")))
  (let ((cost 0.0))
    (flow
      (file-get-lines file)
      (mapcar (do match-case @1
                (`Cost: $@val`
                  (set cost (flo-str val))
                  @1)
                ("Category 0 cost price: $0.00,"
                  (pic "Category 0 cost price $#.##," (* 2 cost)))
                (@else @1)))
      (file-put-lines `@file.tmp`))
    #;(rename-path `@file.tmp` file)))

おすすめ記事