[英]Replacing the pipe in the double quoted csv file with comma using awk command
[英]Parsing CSV file with \n in double quoted fields
我正在解析在雙引號字段中具有換行符的CSV文件。 我正在用普通的腳本逐行讀取文件,但是當我嘗試訪問缺少的令牌時,出現了ArrayIndexOutBoundException。
我試圖對文件進行預處理以刪除這些字符,並且我正在考慮使用一些bash腳本或groovy本身來做到這一點。
您能否提出我可以用來解決問題的任何方法?
CSV如下所示:
header1,header2,header3,header4
timestamp, "abcdefghi", "abcdefghi","sdsd"
timestamp, "zxcvb
fffffgfg","asdasdasadsd","sdsdsd"
這是我正在使用的常規腳本
def csv = new File(args[0]).text
def bufferString = ""
def parsedFile = new File("Parsed_" + args[0]);
csv.eachLine { line, lineNumber ->
def splittedLine = line.split(',');
retString += new Date(splittedLine[0]) + ",${splittedLine[1]},${splittedLine[2]},${splittedLine[3]}\n";
if(lineNumber % 1000 == 0){
parsedFile.append(retString);
retString = "";
}
}
parsedFile.append(retString);
更新:
最后,我做到了這一點,並且它起作用了(我需要將第一列的格式設置為從時間戳到人類可讀的日期):
gawk -F',' '{print strftime("%Y-%m-%d %H:%M:%S", substr( $1, 0, length($1)-3 ) )","($2)","($3)","($4)}' TobeParsed.csv > Parsed.csv
謝謝@karakfa
如果您使用適當的CSV解析器而不是嘗試使用split(如您所見,不適用於任何形式的引用),那么它將正常工作:
@Grab('com.xlson.groovycsv:groovycsv:1.1')
import static com.xlson.groovycsv.CsvParser.parseCsv
def csv = '''header1,header2,header3,header4
timestamp, "abcdefghi", "abcdefghi","sdsd"
timestamp, "zxcvb
fffffgfg","asdasdasadsd","sdsdsd"'''
def data = parseCsv(csv)
data.eachWithIndex { line, index ->
println """Line $index:
| 1:$line.header1
| 2:$line.header2
| 3:$line.header3
| 4:$line.header4""".stripMargin()
}
哪些打印:
Line 0:
1:timestamp
2:abcdefghi
3:abcdefghi
4:sdsd
Line 1:
1:timestamp
2:zxcvb
fffffgfg
3:asdasdasadsd
4:sdsdsd
awk
解救!
這會將換行符拆分的字段合並在一起,您可以從此處進行處理
$ awk -F'"' '!(NF%2){getline remainder;$0=$0 OFS remainder}1' splitted.csv
header1,header2,header3
xxxxxx, "abcdefghi", "abcdefghi"
yyyyyy, "zxcvb fffffgfg","asdasdasadsd"
假定引號的奇數表示拆分字段,並用OFS替換新行。 如果要簡單刪除新行(拆分的部分將合並),請刪除OFS。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.