使用双引号字段中的\ n解析CSV文件

时间:2016-03-18 20:54:12

标签: bash groovy

我正在解析在双引号字段中有分隔线的CSV文件。我用一个groovy脚本逐行读取文件,但是当我试图访问缺少的令牌时,我得到一个ArrayIndexOutBoundException。

我试图预处理文件以删除这些字符,我正在考虑使用一些bash脚本或groovy本身。

请问您能否提出我可以用来解决问题的方法?

这就是CSV的样子:

header1,header2,header3,header4
timestamp, "abcdefghi", "abcdefghi","sdsd"
timestamp, "zxcvb
fffffgfg","asdasdasadsd","sdsdsd"

这是我使用

的groovy脚本
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

2 个答案:

答案 0 :(得分:4)

如果您使用正确的CSV解析器而不是尝试使用拆分(您可以看到它不适用于任何形式的引用),那么它可以正常工作:

@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

答案 1 :(得分:2)

//Here I attach the new loaded items (html var) in the #container div. $("#masonry-grid").append(html).each(function(){ $('#masonry-grid').masonry('reloadItems'); }); $('#masonry-grid').imagesLoaded(function(){ $('#masonry-grid').masonry(); }); 救援!

这会将换行符拆分字段合并在一起,您可以从那里处理它

awk

假设奇数引号意味着分割字段并用OFS替换新行。如果你想简单删除新行(拆分部分将合并)删除OFS。