我的 csv 写得不好:
标题是:
"xxx"|"yyy"|"zzz"|"nnn"|"...."
所以我尝试创建一个扫描仪并在管道上拆分:
Scanner scanner = new Scanner(new File("myCsv.csv"));
int first = 1;
String line;
String row[];
while(scanner.hasNextLine()){
line = scanner.nextLine();
row = line.split("\\|");
if(first==1){
first = 0;
continue;
}
...
}
不幸的是,在 csv 的一列中我发现了一个新行,因此“nextLine”不是获取整行的好方法。
另一个问题是管道存在于列内..类似于:
"field1"|"field|2"|"field3\n"|"..."
所以我认为解析 csv 的最佳方法是创建一个与 ".."|".."
字符串匹配的正则表达式模式。
有人可以帮助我吗?
谢谢!
最佳答案
因为您的 csv 不包含任何转义双引号,所以我建议您进行匹配而不是拆分。
"(?s)\".*?\""
(?s)
称为 dotall 修饰符,它使模式中的点匹配偶数换行符。
String s = "\"xxx\"|\"yyy|bar\"|\"zzz\"|\"nn\n" +
"n\"|\"....\"";
Matcher m = Pattern.compile("(?s)\".*?\"").matcher(s);
while(m.find())
{
System.out.println(m.group(0));
}
输出:
"xxx"
"yyy|bar"
"zzz"
"nn
n"
"...."
如果您不想在最终输出中使用双引号,请使用捕获组。
String s = "\"xxx\"|\"yyy|bar\"|\"zzz\"|\"nn\n" +
"n\"|\"....\"";
Matcher m = Pattern.compile("(?s)\"(.*?)\"").matcher(s);
while(m.find())
{
System.out.println(m.group(1));
}
输出:
xxx
yyy|bar
zzz
nn
n
....
关于java - 读取写得不好的csv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27598273/