我已经编写了一个方法来删除单元格内嵌入的新行。下面的方法返回一个 java.util.List 对象,其中包含 CSV 文件中的所有行
List<String> getAllRowsInCSVFileAsList(File selectedCSVFile){
FileReader fileReader = null;
BufferedReader reader = null;
List<String> values = new ArrayList<String>();
try{
fileReader = new FileReader(selectedCSVFile);
reader = new BufferedReader(fileReader);
String line = reader.readLine();
String previousLine = "";
//
boolean intendLineInCell = false;
while(line != null){
if(intendLineInCell){
if(line.indexOf("\"") != -1 && line.indexOf("\"") == line.lastIndexOf("\"")){
previousLine += line;
values.add(previousLine);
previousLine = "";
intendLineInCell = false;
} else if(line.indexOf("\"") != -1 && line.indexOf("\"") != line.lastIndexOf("\"")){
if(getTotalNumberOfCharacterSequenceOccurrenceInString("\"", line) % 2 == 0){
previousLine += line;
}else{
previousLine += line;
values.add(previousLine);
previousLine = "";
intendLineInCell = false;
}
} else{
previousLine += line;
}
}else{
if(line.indexOf("\"") == -1){
values.add(line);
}else if ((line.indexOf("\"") == line.lastIndexOf("\"")) && line.indexOf("\"") != -1){
intendLineInCell = true;
previousLine = line;
}else if(line.indexOf("\"") != line.lastIndexOf("\"") && line.indexOf("\"") != -1){
values.add(line);
}
}
line = reader.readLine();
}
}catch(IOException ie){
ie.printStackTrace();
}finally{
if(fileReader != null){
try {
fileReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(reader != null){
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return values;
}
int getTotalNumberOfCharacterSequenceOccurrenceInString(String characterSequence, String text){
int count = 0;
while(text.indexOf(characterSequence) != -1){
text = text.replaceFirst(characterSequence, "");
count++;
}
return count;
}
假设您正在创建一个包含一行和五列的 csv 文件,并且在第 4 个单元格中您有一个嵌入的新行(在单元格内输入)
您的数据将如下所示(实际上我们在 csv 中只有一行,但如果您在记事本中打开它看起来像 2 行)。
dinesh,kumar,24,"23
tambaram india",green
如果单元格内有输入,可能如下所示
"23
tambaram india"
该单元格以双引号(“)开头并以双引号(”)结尾。
如果有双引号("),则在读取行时通过使用双引号("),我们可以理解单元格内有一个嵌入的输入。
代码将下一行与该行连接并检查是否有结束双引号(“)。如果有,它会在 java.util.List 对象中添加一个新行,否则它会连接下一行并检查它是否有结束双引号(“)等等。这里我已经解释了一个单元格,但是如果该行有很多带有嵌入式输入的单元格,该方法也适用。