我有一个逗号分隔的文件,对于某些行有"\N"
。我需要加载所有行并跳过所有不包含\N
的行。
我试图做以下但它不起作用。
if (!line.contains("\\N")) {
//do load here
}
上面的代码仍然从下面的csv传递:
1,text,abc,\N,23,56
然后我们有NumberFormatException(它应该是Int Value)。 为什么会这样?
答案 0 :(得分:0)
如果您只想处理包含 \ N 的文件行,请忽略 if 语句条件中的!(感叹号)字符。这是 NOT 标志。
你现在基本上说的是:
仅当提供的条件为布尔 true 时,才会执行如果当前文本文件行包含在字符串变量中 行不包含 \ N ,然后执行 if 语句块中的代码。
IF 语句。申请!如果提供的条件为 NOT true ,则flag基本上将条件设置为 true 。 This可以为您提供更多帮助。
如果您只想要那些包含 \ N 的行,那么您的代码应如下所示:
if (line.contains("\\N")) {
//process line here
}
如果您不要想要处理包含 \ N 的文件行,那么您现在使用的 工作正常。
关于你的问题:
然后我们有NumberFormatException(它应该是Int Value)。 为什么会这样?
\ n (小写字母n)通常是一个标记,它在字符串中应用以在处理时强制使用新行,如果使用大写字母N则不执行此操作。一般来说,很多CSV文件使用 \ N 来表示 NULL ,而其他人只是放置任何内容,只是分隔符。您需要查看创建CSV文件的内容,以找出为什么的实际原因,因为他们可能会将其用于其他内容,但现在您可以将其视为 NULL 。整数变量永远不会为空,默认情况下它们将被视为包含0,因此您可以将代码更改为:
if (line.contains("\\N") { line = line.replace("\\N", "0"); }
然而,您可能会遇到 \ N ,其中应该有一个字符串,所以上面的行对你没有好处。一种解决方案是在拆分文件行后处理每个数组元素内容中的 \ N (应该在那里),例如:
String csvFilePath = "MyCSVfile.txt"; // assuming file is in classpath
try (BufferedReader br = new BufferedReader(new FileReader("MyCSVfile.txt"))) {
int j = 0; //used as a counter
String line = "";
while ((line = br.readLine()) != null) {
j++; //increment counter
String[] data = line.split(",");
//if the ID value contains null then apply the counter (j) value.
int id = Integer.parseInt(data[0].replace("\\N",String.valueOf(j)));
String type = data[1].replace("\\N","");
String text = data[2].replace("\\N","");
int value1 = Integer.parseInt(data[3].replace("\\N","0"));
int value2 = Integer.parseInt(data[4].replace("\\N","0"));
int value3 = Integer.parseInt(data[5].replace("\\N","0"));
System.out.println("ID is:\t\t" + id + "\nData Type is:\t" + type +
"\nText is:\t" + text + "\nValue 1 is:\t" + value1 +
"\nValue 2 is:\t" + value2 + "\nValue 3 is:\t" +
value3 + "\n");
}
br.close();
}
catch (IOException ex) {
//however you want to handle exception
}
无论在任何一个CSV文件行中遇到什么位置,都会处理 \ N 标记。