web-dev-qa-db-ja.com

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が提供するバージョンで機能するコマンドが必要になります。

3
Steve Shiny
_sed -E 's,^([0-9]+)/([0-9]+),\2/\1,'
_

説明

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

使用法

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

3
Sparhawk

日付を再フォーマットするときは、標準(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
'

また、ローカル以外の日時について考えているときに、そのタイムスタンプはどのタイムゾーンに属しますか? UTCですか?

0
glenn jackman