【问题标题】:Split file input by comma into an array Java, and re-writing to the file通过逗号将文件输入拆分为数组Java,并重新写入文件
【发布时间】:2015-07-05 11:07:42
【问题描述】:

假设我有一个文件 text.txt,其中一行包含以下内容:

abc, def, ghi, jkl

我正在尝试获取文件中的数据列表,因此 myList 将导致 ["abc"、"def"、"ghi"、"jkl"],但它似乎不起作用:

String[] tokens;
try {
        Scanner scanner = new Scanner("text.txt");
        while (scanner.hasNext()) { tokens = scanner.nextLine().split(","); }
} catch (IOException e) {
        e.printStackTrace();
}
System.out.println(tokens.length); // Prints 1 instead of 4

并且尝试打印索引 0-3 会出现越界错误(显然是因为长度仅为 1)

然后我想更改索引之一(在数组中)中的数据,并将其重新写入/覆盖写回文件。 我认为这个答案应该可以解决这个问题,但只有在我能够正确处理数组之后。 https://stackoverflow.com/a/1016291/4669619

编辑:目前,我知道我的文件只有 4 个用 3 个逗号分隔的内容,如示例文本文件所示。

【问题讨论】:

  • 我还能访问任何令牌索引吗?即更改特定数据,并像“fooWriter.write(tokens[2]);”一样重写它如链接的 SO 问题所示。
  • @JBNizet 我将如何保存、修改和访问数据(并获取长度)?
  • @Ali 你会阅读 List 的 javadoc,发现它有一个方法 size() 和一个方法 get(int index)。

标签: java list file split


【解决方案1】:

你正在为每一行覆盖tokens(我认为你有一个空行)

试试

String[] tokens;
try {
    scanner = new Scanner(new File ("text.txt"));
    while (scanner.hasNextLine())       // change this
    { 
         tokens = scanner.nextLine().split(","); 
         System.out.println(tokens.length); 
     }
} catch (IOException e) {
    e.printStackTrace();
}

【讨论】:

  • 打印了 1 x4 次。
  • 您的代码是从字符串而不是文件实例化扫描仪。查看我的更新
【解决方案2】:

编辑:您没有阅读text.txt 文件。使用new Scanner("text.txt"),您正在使用构造函数Scanner(String source)`,而您想要的是Scanner(File source)

我认为这就是您使用 ArrayList 寻找的内容:

ArrayList<String> tokens = new ArrayList<String>();
try {
        File file = new File("text.txt");
        Scanner scanner = new Scanner(file);
        while (scanner.hasNext()) { 
            String[]  str= scanner.nextLine().split(",");
            for(int i=0;i<str.length;i++){
                tokens.add(str[i]);
            }
        }
} catch (IOException e) {
        e.printStackTrace();
}
System.out.println(tokens.size());

【讨论】:

    【解决方案3】:

    您的代码表明您的循环将一直运行到文件结束,并返回文件的最后一行。你能检查这是否是你需要的吗?也许您的最后一行不包含“,”。

    【讨论】:

      【解决方案4】:

      感谢各位提供宝贵意见,但我相信我已经解决了我的问题:

      String[] tokens;
      try {
          Scanner scanner = new Scanner("text.txt");
          tokens = scanner.nextLine().split(",");
      } catch (IOException e) {
          e.printStackTrace();
      }
      

      如果我得到一些赞成票来证明我的解决方案确实是(其中一个)正确的,我会选择这个作为正确答案!

      【讨论】:

      • @scary wombat 已经编辑了他的帖子,并在您发布您的帖子前 13 分钟将其改正。现在我觉得你不欣赏他帮助你的努力:\
      • 不是我不欣赏。我上次检查答案的时间和我发布答案的时间之间存在差距。我的编辑器打开了一段时间,所以这可能是我没有看到它的原因。我已经接受了他的答案作为选定的答案。
      【解决方案5】:

      当你声明一个数组时,你需要指定它的大小。然后,您可以将令牌分配到数组上的特定位置。

      String[] myStringArray = new String[3];
      myStringArray[0] = "sample string";
      

      您的问题是您并不真正知道您的数组将包含多少个元素。所以最好的解决方案是使用ArrayList

      ArrayList<String> myStringArrayList = new ArrayList<String>();
      myStringArrayList.add("sample string");
      

      尝试将其合并到您的代码中。

      【讨论】:

      • 当你声明一个数组时,你需要指定它的大小 - 没必要。您只需声明一个可以指向数组对象的 reference
      • 声明时不必指定数组的大小。正如@TheLostMind 所说,这只是一个参考。
      • 目前,我知道我的数组将包含 4 个用 3 个逗号分隔的东西(如示例文本文件示例所示)
      • 我可能使用了错误的措辞。采取的观点。我的意思是当你创建一个新的数组实例时,你必须指定数组大小和/或指定数组元素。
      • @jmcg OP 没有创建任何数组。他声明了一个 String[] 类型的变量。创建和返回数组的是 split() 方法。
      猜你喜欢
      • 2012-06-05
      • 1970-01-01
      • 2016-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多