Java 字符串的csv分隔
可能重复:Java 字符串的csv分隔,java,csv,Java,Csv,可能重复: 我有一个姓名、年龄和国家的列表,格式是“姓名”,16,“加拿大”,有些是“第一,第二”,21,“加拿大”我如何区分这些 我一直在使用.split,但无法使其适用于这些字符串格式。我使用的这有两个类,一个是读取类,另一个是写入csv类,可以处理引用字符串。我将使用并执行以下操作: CSVReader reader = new CSVReader(new FileReader("yourfile.csv")); String [] nextLine; while ((nextLine
我有一个姓名、年龄和国家的列表,格式是
“姓名”,16,“加拿大”
,有些是“第一,第二”,21,“加拿大”
我如何区分这些
我一直在使用.split
,但无法使其适用于这些字符串格式。我使用的这有两个类,一个是读取类,另一个是写入csv类,可以处理引用字符串。我将使用并执行以下操作:
CSVReader reader = new CSVReader(new FileReader("yourfile.csv"));
String [] nextLine;
while ((nextLine = reader.readNext()) != null) {
// nextLine[] is an array of values from the line
}
可能有一些库可以为您做到这一点(请参阅前面的答案)。 但是,如果您想手工编写代码,则需要构建一个有限状态机,并独立检查字符串中的每个字符,以确定是否包含在引号内。你基本上需要两个州-在_QUOTE,没有_QUOTE-因为考试规则根据你的州而不同。如果在引号内,则要忽略逗号。如果在引号之外,则需要逗号分隔字段 我头上的Psuedo代码看起来像:
String line = <input string>
List<String>fields = new ArrayList<String>();
StringBuffer field = new StringBuffer();
for( int i = 0 ; i < line.length(); i++){
char c = line.charAt(i);
switch( state ){
NO_QUOTE:
// check if character is a quote or a comma. If neither append character to field
if( quote )
// change state
state = IN_QUOTES;
else if( comman )
// close the field and start a new one
fields.add(field.toString());
field = new StringBuffer();
else
field.append(c);
break;
IN_QUOTES:
// only search for a closed quote mark
if( quote )
// change state
state = OUT_QUOTES;
else
field.append(c);
}
字符串行=
Listfields=newarraylist();
StringBuffer字段=新的StringBuffer();
对于(int i=0;i
综上所述,您的检查规则可能变得过于复杂和棘手(您是否需要检查转义引号?UTF-8或其他字符集如何?等等),并且当其他几个LIB似乎已经为您完成了这项工作时,可能不值得您重新发明轮子。可能重复:相关: