我正在解析在双引号字段中有分隔线的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
答案 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。