2017-02-05 6 views
0

ファイルの追加:CSVへの新しい列が、私はこのようになりますCSVファイルを持っている

"12345","TestTest","1.2","TestTest 
" 

私は、このようなYYYY-MM-DD HHとして日付を追加する:MM:SSをいずれかの先頭にまたはCSVファイルの末尾に入力します。上記の例のように、二重引用符( ")は列の値を囲み、コンマ(、)は各列を区切ります。行末の二重引用符は常に新しい行にあります。これは、sedを使用して単一の二重引用符に基づいて検索/置換を試みたときに、行の先頭だけでなく行の最後にも置換が終了することを意味します。

CSVラインの開始が二重引用符と数字(つまり「12345」)である場合にのみ、日付に追加するツール(sed、awk、なにか)を使用することが可能かどうかは、新しい行が

"YYYY-MM-DD HH:MM:SS","12345","TestTest","1.2","TestTest 
" 

注:このコマンドは、この変更をe非常にCSVファイルの行。これはまた、linuxのコマンドラインから実行する必要があります。

おかげで、SEDで

答えて

1

sed 'N;s/^/"YYYY-MM-DD HH:MM:SS",/' file 

あなたが次の行に単一"があることを確認したい場合は、次の

sed 'N;/\n"$/s/^/"YYYY-MM-DD HH:MM:SS",/' file 

編集:

5日後に文字列を挿入するにはフィールド:

sed 'N;s/","/","YYYY-MM-DD HH:MM:SS","/5' file 
+0

列フィールドの1つを選択することはできますか?私のCSVには13のフィールドがあります。 sedは(、)区切り文字の数を数えることができますか?それは5番目の列と最初と最後のどちらに挿入するのでしょうか? – Alby

+0

私は自分の答えを編集しましたが、 'awk'を使ってcsvファイルを扱うことを検討すべきです。 – SLePort

+0

ありがとうございます。 sedを使ってデータを挿入すると、必要な魔法が得られます。 – Alby

2

awkレスキュー!ので、新しいフィールドでそれを付加場合

$ awk -F, 'NF>1{$0 = "\"YYYY-MM-DD\"" FS $0}1' file 

NF>1テストは、ライン上の複数のフィールドがあるかどうかをチェックし、最後に1{print}の省略形です。

+0

列フィールドの1つを選択することはできますか?私のCSVには13のフィールドがあります。 awkが(、)区切り文字の数を数えることができますか?それは5番目の列と始まりまたは終わりのどちらに挿入するのでしょうか? – Alby

+0

ステートメントで$ 0の代わりに$ 5を使用します。 – karakfa

+0

フィールドを変更する場合は、OFSも設定する必要があります。 –

1

区切り文字や改行を含む可能性のあるフィールドの問題を避けるために、csvパーサを使用することをお勧めします。 Text::CSVモジュールは、perlコマンドラインで使用できます。第4列に文字列を挿入する例:

perl -MText::CSV -E'$csv = Text::CSV->new({binary=>1}); 
while ($row = $csv->getline(STDIN)){ 
    splice @$row, 3, 0, "YYYY-MM-DD"; 
    say "\"", join("\",\"",@$row), "\"" 
}' file.csv 
関連する問題