我正在尝试通过使用带有分隔符的scanner来解析一个相当特殊格式的文件,但我对regex还是个新手。格式:
“玛丽”,“帕特里夏”,“琳达”,“芭芭拉”,“伊丽莎白”,“詹妮弗”,...
目前,我使用的分隔符和代码如下:
static void readNames(String[] names) {
try {
Scanner sc = new Scanner(new File("names.txt")).useDelimiter(",");
int count = 0;
while(sc.hasNext()) {
names[count] = sc.next();
count ++;
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
然而,这给了我引号,这不是我想要的。
然后,我尝试使用以下分隔符:
String delimiter = " "," ";
我很快意识到,由于大量的引号,它不能被识别为字符串。
这是在我得到答案后编辑的,但是有没有办法像我在第二个分隔符中想要的那样,使用",“作为分隔符?
发布于 2018-10-21 03:03:04
根据你帖子中给出的数据,我认为你可以使用这个模式","|“
下面是你可以写的代码,
public static void main(String[] args) throws Exception {
Scanner sc = new Scanner(new FileInputStream("filename.txt"));
sc.useDelimiter(Pattern.compile("\",\"|\""));
while(sc.hasNext()) {
System.out.println(sc.next());
}
sc.close();
}
发布于 2018-10-25 13:11:35
如果你只是想要一个java编写的有用的csv解析器。我最近写了一篇很好的文章:
public static Iterable<String[]> parseCSV(final InputStream stream) throws IOException {
return new Iterable<String[]>() {
@Override
public Iterator<String[]> iterator() {
return new Iterator<String[]>() {
static final int UNCALCULATED = 0;
static final int READY = 1;
static final int FINISHED = 2;
int state = UNCALCULATED;
ArrayList<String> value_list = new ArrayList<>();
StringBuilder sb = new StringBuilder();
String[] return_value;
public void end() {
end_part();
return_value = new String[value_list.size()];
value_list.toArray(return_value);
value_list.clear();
}
public void end_part() {
value_list.add(sb.toString());
sb.setLength(0);
}
public void append(int ch) {
sb.append((char) ch);
}
public void calculate() throws IOException {
boolean inquote = false;
while (true) {
int ch = stream.read();
switch (ch) {
default: //regular character.
append(ch);
break;
case -1: //read has reached the end.
if ((sb.length() == 0) && (value_list.isEmpty())) {
state = FINISHED;
} else {
end();
state = READY;
}
return;
case '\r':
case '\n': //end of line.
if (inquote) {
append(ch);
} else {
end();
state = READY;
return;
}
break;
case ',': //comma
if (inquote) {
append(ch);
} else {
end_part();
break;
}
break;
case '"': //quote.
inquote = !inquote;
break;
}
}
}
@Override
public boolean hasNext() {
if (state == UNCALCULATED) {
try {
calculate();
} catch (IOException ex) {
}
}
return state == READY;
}
@Override
public String[] next() {
if (state == UNCALCULATED) {
try {
calculate();
} catch (IOException ex) {
}
}
state = UNCALCULATED;
return return_value;
}
};
}
};
}
您通常会非常有帮助地处理此过程,如下所示:
for (String[] csv : parseCSV(stream)) {
//<deal with parsed csv data>
}
通常,它将csv流解析器包装在一个迭代器中,因此您可以使用特殊的java for循环。所以你给它一个流,它会给你一个字符串数组的for循环,这通常是你想要的数据的最好方式。
如果你想要理解,你需要用额外的信息更好地表达你的问题,清楚地表明你认为你需要什么以及为什么,因为你的帖子中的大多数都没有多大意义。
https://stackoverflow.com/questions/52909041
复制相似问题