我的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的最佳方法是创建一个匹配".."|".."
字符串的正则表达式模式。
有人可以帮助我吗?
谢谢!
答案 0 :(得分:1)
因为你的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
....
答案 1 :(得分:0)
答案 2 :(得分:0)
选择一位已经存在的CSV Library来处理此问题和其他问题。 CSV不是直接的&#34;逗号分隔&#34;所以没有必要重新发明轮子
答案 3 :(得分:-2)
使用此正则表达式["][|]["]
进行简单的字符串拆分测试。
因此,您可以使用以下代码:row = line.split("[\"][|][\"]");
或者我的测试用简单的字符串拆分:
public static void main(String[] args) {
String text = "\"xxx\"|\"yyy\"|\"zzz\"|\"nnn\"|\"....\"";
String regex = "[\"][|][\"]";
String[] textArray= text.split(regex);
for(String part:textArray){
System.out.println(part);
}
}
这将输出:
"xxx
yyy
zzz
nnn
...."
所以只需删除&#34;在开头和结尾,你有你的分裂字符串。