如何从已包含双引号的文件中读取字符串?

How do I read strings from a file that already contain double quotes?

我在 .txt 文件中有一个名称列表,格式如下:

"Tim", "Dave", "Simon"

输入始终是单值名称,用引号括起来,以逗号分隔并在一行中。

我想把这些读成String[] names

我有以下代码,但输出将每个代码都放在双引号中,意思是它看起来像:

“蒂姆”、“戴夫”、“西蒙”

我也无法使用任何第三方库。

如何让String数组中的每个元素只有一组双引号?

String[] names = {};

// arraylist to store strings
List<String> listOfStrings = new ArrayList<String>();

// load content of file based on specific delimiter
Scanner sc = new Scanner(new FileReader("names.txt")).useDelimiter(",");
String str;

while (sc.hasNext()) {
    str = sc.next();
    listOfStrings.add(str);
}

对不起。其实这样更好

add(s.replace("\"", ""));

I have a list of names in a .txt file which are already in a String format:

他们实际上不是;那不是 'string format';实际上没有 'string format'.

这样的东西

鉴于输入文件包含引号并且您知道这些引号实际上并不是输入的一部分,只是分隔输入,我们可以减少对这实际上是什么格式的合理猜测。实际上只有两种常用格式:

标准 CSV 格式

“CSV”(“字符分隔值”)是一种极为常见的数据交换格式。不幸的是,没有规范。但到目前为止,这种格式最常见的 'take' 涉及以下转义规则:

  • 换行符分隔记录。
  • 某个指定的字符在单个记录中分隔 2 个项目;通常是逗号、制表符或分号 - 在您的输入中显然是逗号。
  • 所以.. 如果其中一项包含逗号或换行符怎么办?在这种情况下,通常的答案是将输入用引号括起来,有时,CSV 输出工具 quote-delimits 一切,即使不需要(例如,大概是您的示例)。然而,这又引发了另一个问题:如果输入包含引号怎么办。然后,答案是将它们加倍。因此,文字字符串:Jane said: "Well, hello there!" 变为 example.csv:
"Jane said: ""Well, hello there!"""

甚至有一个标准:RFC 4180。这是一个 one-pager。随意快速浏览一下。

backslash-escape CSV

考虑到大约 90% 的编程语言都有这样工作的字符串常量,另一种方法变得越来越流行,它是将反斜杠符号视为转义符号:反斜杠后面总是跟一个字符,并且这对根据查找 table 一起告诉您实际意图是什么。常见的转义是:

  • \n -> 那是一个换行符
  • \t -> 一个选项卡
  • \" -> 文字引用
  • \, -> 文字逗号

还有一些(\r\f\b3\u1234 都比较常见)。

除非此文本文件的来源告诉您它是哪种格式,或者通过获取包含此类字符串的更复杂的输入,否则根本无法知道。如果你能控制输出的实际文字文本,在文字文本中用换行符和逗号和双引号制作一个复杂的字符串,将其导出到这个文本文件中,看看它是什么样子。

那么我该如何解析呢?

它非常复杂 - 正确解析它的代码有很多页那么长。不过你很幸运!存在大量图书馆。

通常的方法是使用 OpenCSV - 这是一个指导您如何使用它的教程。

我只想要一个字符串 Tim, Dave, Simon

好吧,这不是您的输入文件所说的;很明显,那么您的输入文件是某种未知格式,您将不得不解释如何从文本文件包含 "Tim", "Dave", "Simon" 的概念到希望在单个字符串中包含 Tim, Dave, Simon多变的。也许输入确实是 CSV 格式,您只是希望将每个项目连接在一起,用逗号分隔。在这种情况下,使用 OpenCSV 读取它,然后编写连接项目所需的非常简单的代码。 OpenCSV 可以给你一个 List<String> 来表示一个 'line' 的输入——把它变成一个逗号分隔的字符串,这很简单:

String[] csvLine = opencsv.readNext();
String output = String.join(", ", csvLine);
assert output.equals("Tim, Dave, Simon");