我正在编写一个Java程序,其中包含两列信息的制表符分隔值(TSV)文件由BufferedReader读取,然后分成两个组件(稍后将在HashMap中用作[key,value]对)在程序中)使用String.split(" \ t")。让我们说TSV文件的第一行如下:
Key1 \ tHello world \ n编程很酷\ nGoodbye
下面显示的代码将此行分为" Key1"和#34; Hello world \ n编程很酷\ nGoodbye":
File file = new File("sample.tsv");
BufferedReader br = new BufferedReader(new FileReader(file));
String s = br.readLine();
String[] tokens = new String[2];
tokens = s.split("\t");
现在出现的问题是尝试打印第二个字符串(即标记[1])。
System.out.println(tokens[1]);
上面的代码行导致第二个字符串被打印,并且新行字符(\ n)被忽略。换句话说,这是印刷的......
Hello world \ n编程很酷\ nGoodbye
......而不是......
Hello world
编程很酷
再见
如果我使用与上面相同的文本创建一个新字符串并使用String.equals()方法来比较两者,则返回false。
String str = "Hello world\nProgramming is cool\nGoodbye";
boolean sameString = str.equals(tokens[1]); // false
为什么String.split()返回的字符串中的特殊字符是否可以正确打印?
答案 0 :(得分:0)
BufferedReader.readLine()将您的字符串读取为一行,就像它在文件中的表示方式一样。缓冲读取器没有读取“\ n”作为ASCII(10)0x0A,它读取“ASCII(92)0x9C ASCII(110)0x6E”。
如果您按照预期的方式使用文本编辑器输入输入文件,它将以您期望的方式打印。
在类似unix的系统上:
echo -e“Hello world \ nProgramming很酷\ nGoodbye”> InputFile.result_you_want
回声“Hello world \ nProgramming很酷\ nGoodbye”> InputFile.result_you_get您可以使用echo之类的程序来转换TSV,但是您需要拆分“\ t”字符,ASCII(9)0x09,而不是文字“\ t”。
Split采用正则表达式。转义该标签字符可能很有趣。 “\ t”或“\\ t”可以在那里做到。
如果这是为了工作,您可能希望使用工具或库来解决必须使用echo转换文件的问题。 String parsing in Java with delimeter tab "\t" using split在那里有一些建议。
搜索CSV java API可能非常有用。大多数都允许您设置分隔符字符和行结束格式的信息。
答案 1 :(得分:-1)
因为在计算机方面,文本'\ n'不像二进制'\ n'。
你的第一行文件,我认为就像key1 Hello world \ nProgramming \ ncool
所以它可以分割\ t,但是当涉及到打印时,它只显示文本 '\ n'但不是二进制'\ n',它将构成新的行