簡體   English   中英

用雙引號字段中的\\ n解析CSV文件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM