1

次のようにフォーマットされた日時のCSVファイルがあります。

8/2/2012 1:34:01 PM

そのような日付のすべての出現 (おそらく正規表現) を見つけて、それを (ファイル内で) mysql のデフォルトの日時形式 (2012-08-02 13:34:01) に変換する必要があります。

見つけた

date --date="8/2/2012 1:34:01 PM" +"%F %T"

正常に動作しており、正しい結果が得られています。解決策は、間違ってフォーマットされた日付をすべて見つけて、上記の日付関数に渡すことです。

CSV ファイルの 1 行は次のようになります。

"Data 1","Data 2","Data 3","Data 4","100000000100","100000002263","10/31/2012 10:02:03 AM","1/29/1999 1:54:50 PM","11/6/2012 8:47:01 PM","S"

どうもありがとう!

4

3 に答える 3

2

これで大丈夫ですか?

awk -F, -vOFS=','  '{for (i=7;i<=9;i++) {"date --date="$i" +\"%F %T\"" |getline $i;$i="\""$i"\""}}1' file

その行でテストします。

kent$  echo '"Data 1","Data 2","Data 3","Data 4","100000000100","100000002263","10/31/2012 10:02:03 AM","1/29/1999 1:54:50 PM","11/6/2012 8:47:01 PM","S"'|awk -F, -vOFS=','  '{for (i=7;i<=9;i++) {"date --date="$i" +\"%F %T\"" |getline $i;$i="\""$i"\""}}1'
"Data 1","Data 2","Data 3","Data 4","100000000100","100000002263","2012-10-31 10:02:03","1999-01-29 13:54:50","2012-11-06 20:47:01","S"
于 2013-01-15T11:20:00.593 に答える
0

perlの使用がオプションである場合、これは要件に合うはずです

#! /usr/bin/perl

use strict;
use warnings;

while (my($m, $d, $y, $H, $M, $S, $a) = m!\"(\d+)/(\d+)/(\d+)\s+(\d+):(\d+):(\d+)\s+([ap]m)\"!i) {
    $H += 12 if ($a =~ m/pm/i);
    my $dt = sprintf("%04d-%02d-%02d %02d:%02d:%02d", $y, $m, $d, $H, $M, $S);
    s!!$dt!;
}

でそれを呼び出す

perl -i.bak -p convert.pl csv.txt

これにより、日付がMyS​​QL形式に変換されます。また、バックアップファイルを作成しますcsv.txt.bak

于 2013-01-15T12:20:03.807 に答える
0

適切な CSV パーサーを備えたツールを使用します。これがルビーの例です

ruby -e '
  require "csv"
  require "date"

  def format_date(date)
    DateTime.strptime(date, "%m/%d/%Y %r").strftime "%Y-%m-%d %T"
  end

  CSV.foreach ARGV[0] do |row|
    [6,7,8].each {|i| row[i] = format_date row[i]}
    puts CSV.generate_line row, {:force_quotes => true}
  end
' file.csv

サンプル入力を考えると、これは出力します

"Data 1","Data 2","Data 3","Data 4","100000000100","100000002263","2012-10-31 10:02:03","1999-01-29 13:54:50","2012-11-06 20:47:01","S"
于 2013-01-15T14:34:24.877 に答える