CSVファイルの日付形式の変更

CSVファイルの日付形式の変更

次の形式でデータを出力するプログラムがあります。

date, time,field1,field2,field3,fieldn
12/20/14,08:01:53,318.622,0.93712,21.6867,1.1089

ファイルには多くの列があり、すべて同じままにする必要があります。

日付形式は米国ですが、米国ではない国が必要です。

date, time,field1,field2,field3,fieldn,....
20/12/14,08:01:53,318.622,0.93712,21.6867,1.1089,....

これを達成する最も簡単な方法は何ですか?探してみると、いくつかの例がありますが、まさに私の場合ではありません。また、dateコマンドであるawkとsedを調べましたが、コマンドを生成するのに十分な知識がありません。例えばこの回答awkを使用すると大丈夫に見えますが、私のファイルには何の効果もありません。

私はMacを使っているので、OSXが提供するバージョンに合った命令が必要です。

答え1

sed -E 's,^([0-9]+)/([0-9]+),\2/\1,'

説明する

  • sed -E:拡張正規表現でsedを使用すると、エスケープなど()をする必要はありません。
  • s/foo/bar/sedfoo:で検索して置換する一般的な構文ですbar。ここでは式にsがある,ので代わりに使用しています。これは単純化されます(エスケープ混乱を避けるためにもう一度申し上げます。したがって。//s,foo,bar,
  • ^([0-9]+)/([0-9]+)^:1つ以上の数字が続く行の先頭を検索して[0-9]+キャプチャグループに入れます()。今月です。以下は、/別のキャプチャグループ内の1つ以上の数字(日付など)です。
  • \2/\1/:2番目のキャプチャグループ(日)、次に最初のキャプチャグループ(月)に置き換えます。

使用法

ファイルをこのコマンド(例:)にパイプする<your_command_here>| sed…か、ファイルから直接実行できます(例:)sed… file.txt。これによりコマンドラインに直接出力されます。新しいファイルに書き込むには、> output.txtコマンドに追加します。

答え2

日付形式を再指定するときは、標準(ISO)形式(YYYY-mm-dd)を使用することをお勧めします。

perl -MTime::Piece -F, -lane '
  if ($.>1) {$F[0] = Time::Piece->strptime($F[0], "%m/%d/%y")->strftime("%F")}
  print join ",", @F
'

また、現地以外の日時を考えると、このタイムスタンプはどのタイムゾーンに属していますか?世界時ですか?

関連情報