CSVから熱を内部変換

CSVから熱を内部変換

CSVの日付変換に助けが必要です。デフォルトでは、列を変換して新しいファイルとして保存できますが、元のCSVには保存できません。

私のCSVの最初の列DD/MM/YYYY HH:MMに変換したい日付形式のCSVがあります。YYYY-MM-DD HH:MM

私のCSVファイルには次の内容があります。

29/01/2018 14:07,payable,37159871,,30521316
29/01/2018 14:07,payable,37159872,,30521316
29/01/2018 14:07,payable,37159870,,30521316
29/01/2018 14:07,payable,37159869,,30521316
29/01/2018 14:07,payable,37159868,,30521316

私は次のようなものが欲しい:

2018-01-29 14:07,payable,37159871,,30521316
2018-01-29 14:07,payable,37159872,,30521316
2018-01-29 14:07,payable,37159870,,30521316
2018-01-29 14:07,payable,37159869,,30521316
2018-01-29 14:07,payable,37159868,,30521316

私ができること:

gawk -F, '{split($1, a, "/| "); print a[3]"-"a[2]"-"a[1]" "a[4]}' /path/to/file.csv > test_file

ここでCSVファイルに再保存する方法を知りたいです。

答え1

この例の編集は非常に簡単なので、Awkを使用する必要はありません。

GNU Sedの使用は次のように簡単です。

sed -rie 's_^(..)/(..)/(....)_\3-\2-\1_' file.csv

BSD Sed の場合は、以下を使用します。

sed -Ei '' -e 's_^(..)/(..)/(....)_\3-\2-\1_' file.csv

POSIXツールだけを使用すると、少し見苦しいですが、悪くはありません。

printf '%s\n' '%s/^\(..\)\/\(..\)\/\(....\)/\3-\2-\1/' x | ex file.csv

編集:実際に詳しく見てくださいPOSIX仕様exSed と同様に、(ほぼ)すべての区切り文字が使用可能であることを示します。だから:

printf '%s\n' '%s_^\(..\)/\(..\)/\(....\)_\3-\2-\1_' x | ex file.csv

少しより良いもの。

答え2

awkには「所定の位置で編集」オプションが組み込まれておらず(通常は後ろからコピーとして実装されています)、読み取り後この回答、この場合、私が好む解決策は次のとおりです。

cp入力ファイル一時ファイル&&コマンド...一時ファイル>入力ファイル&& rm一時ファイル

あなたの状況に合わせて:

cp /path/to/file.csv temp_file &&
gawk -F, '{split($1, a, "/| "); print a[3]"-"a[2]"-"a[1]" "a[4]}' < temp_file > /path/to/file.csv &&
rm temp_file

&&コマンドを一緒にバインドし、前のコマンドが成功した場合にのみ後続のコマンドを実行する構文を参照してください。

答え3

GNU awkを使用しているので:

gawk -i inplace -F, ...

元のファイルをバックアップしたい場合

gawk -i inplace -v INPLACE_SUFFIX=".bak" -F, ...

https://www.gnu.org/software/gawk/manual/html_node/Extension-Sample-Inplace.html#Extension-Sample-Inplace

答え4

次のawkコマンドを使用して同じ効果を得ました。

入力.csv

2018-01-29 14:07,payable,37159871,,30521316
2018-01-29 14:07,payable,37159872,,30521316
2018-01-29 14:07,payable,37159870,,30521316
2018-01-29 14:07,payable,37159869,,30521316
2018-01-29 14:07,payable,37159868,,30521316

注文する

awk '{gsub("/","-",$0);print $0}' input.csv| awk -F "-" '{print $3,$2,$1}'  | awk -F " " '{print $1"-"$(NF -1)"-"$NF,$2}'

出力

2018-01-29 14:07,payable,37159871,,30521316
2018-01-29 14:07,payable,37159872,,30521316
2018-01-29 14:07,payable,37159870,,30521316
2018-01-29 14:07,payable,37159869,,30521316
2018-01-29 14:07,payable,37159868,,30521316

関連情報