我有"Name",16,"Canada"
格式的姓名,年龄和国家/地区列表,有些是"First, Second",21,"Canada"
我如何分开这些?
我一直在使用.split
,但无法让它适用于这些格式的字符串。
答案 0 :(得分:0)
我正在使用Java CSV LIbrary这有两个类一个读取,另一个写csv可以处理引用的字符串。
答案 1 :(得分:0)
我会使用OpenCSV并执行以下操作:
CSVReader reader = new CSVReader(new FileReader("yourfile.csv"));
String [] nextLine;
while ((nextLine = reader.readNext()) != null) {
// nextLine[] is an array of values from the line
}
答案 2 :(得分:0)
有可能的库可以为您做到这一点(参见前面的答案)。 但是,如果要手动编写代码,则需要自己构建一个有限状态机,并独立检查字符串中的每个字符,以确定是否属于引号。您基本上需要两种状态 - IN_QUOTE,NO_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);
}
所有这一切,你的考试规则可能变得过于棘手和复杂(你需要检查逃脱的引号吗?UTF-8或其他字符集怎么样?等等)并且可能不值得你努力重新发明轮子时,其他几个lib似乎已经为你做了这项工作。