csvファイルに2つのフィールドを追加する必要があります。 csvフィールドの区切り文字はでcomma
あり、一部のフィールドは二重引用符内にあります。問題は、二重引用符で囲まれたフィールド内でもカンマを見つけることができることです。 awkを使って分割する方法は?
このフィールドは mongo エクスポートから取得されます。このフィールドの位置は変更されることがあります。
入力CSVの例、
DateTime,Dealers,Locations,CallEndTime,TotalDuration
"2018-12-27 12:19:14","Dealer1,Dealer2,Dealer3","Gujarat",,67,,
"2018-12-27 12:19:14","Dealer1,Dealer2","Gujarat,Vadodara",,100,
出力例CSV、
DateTime,Dealers,Locations,CallEndTime,TotalDuration
"2019-01-07 11:35:42","Dealer1,Dealer2,Dealer3","Gujarat","2019-01-07 11:36:51",69,,
"2018-12-27 12:19:14","Dealer1,Dealer2","Gujarat,Vadodara","2018-12-27 12:19:14,78",
奇妙なコード:
BEGIN { FSOFS=","}
NR==1 {
for (i=1; i<=NF; i++) {
f[$i] = i
}
}
NR>1 {
begSecs = mktime( gensub( /[":-]/, " ", "g", $(f["DateTime"]) ) )
endSecs = begSecs + $(f["TotalDuration"])
$(f["CallEndTime"]) = strftime("%Y-%m-%d %H:%M:%S", endSecs)
}
{print}
二重引用符内のカンマをFSで処理したくありません。 FPATを使用してこれを行うことができることを見ましたが、ここでは次の場合に備えて使用する方法についての手がかりはありません。
BEGIN { FPAT = "([^,]*)|(\"[^\"]+\")"}
NR==1 {
for (i=1; i<=NF; i++) {
f[$i] = i
}
}
NR>1 {
begSecs = mktime( gensub(/[":-]/," ","g",$(f["DateTime"])) )
endSecs = begSecs + $(f["TotalDuration"])
$(f["CallEndTime"]) = strftime("%Y-%m-%d %H:%M:%S", endSecs)
}
{print}
ベストアンサー1
私はそれをcsvファイルを解析するために使用しません。awk
たとえば、python csvモジュールを使用する専用ツールを使用する方が良いでしょう。
#!/usr/bin/env python3
import csv, shutil
from tempfile import NamedTemporaryFile
from datetime import datetime
from datetime import timedelta
tempfile = NamedTemporaryFile(mode='w', delete=False)
with open('input.csv') as csvfile:
reader = csv.DictReader(csvfile)
writer = csv.DictWriter(tempfile, fieldnames=reader.fieldnames)
writer.writeheader()
for row in reader:
row['CallEndTime']=datetime.strptime(row['DateTime'], '%Y-%m-%d %H:%M:%S') + timedelta(seconds=int(row['TotalDuration']))
writer.writerow(row)
shutil.move(tempfile.name, 'output.csv')
出力.csv:
DateTime,Dealers,Locations,CallEndTime,TotalDuration
2018-12-27 12:19:14,"Dealer1,Dealer2,Dealer3",Gujarat,2018-12-27 12:20:21,67
2018-12-27 12:19:14,"Dealer1,Dealer2","Gujarat,Vadodara",2018-12-27 12:20:54,100