【问题标题】:How to to add values from a file into an array using split?如何使用拆分将文件中的值添加到数组中?
【发布时间】:2016-08-12 08:16:35
【问题描述】:

我有以下代码:

BufferedReader metaRead = new BufferedReader(new FileReader(metaFile));
String metaLine = "";
String [] metaData = new String [100000];

while ((metaLine = metaRead.readLine()) != null){
    metaData = metaLine.split(",");
    for (int i = 0; i < metaData.length; i++)
        System.out.println(metaData[0]);
}

这是文件中的内容:

testTable2  Name    java.lang.Integer   TRUE    test
testTable2  age     java.lang.String    FALSE   test
testTable2  ID      java.lang.Integer   FALSE   test

我希望数组在metaData[0]testTable2metaData[1] 将是Name,但是当我在0 运行它时,我得到testtable2testtable2testtable2,在1 我会得到NameageIDOutOfBoundsException

有什么想法可以得到我想要的结果吗?

【问题讨论】:

    标签: java string file split bufferedreader


    【解决方案1】:

    只需打印metaData[i] 而不是metaData[0] 并用"[ ]+" 分割每个字符串(这意味着“1 个或多个空格”):

    metaData = metaLine.split("[ ]+");
    

    结果,你会得到以下数组:

    [testTable2, Name, java.lang.Integer, TRUE, test]
    [testTable2, age, java.lang.String, FALSE, test]
    [testTable2, ID, java.lang.Integer, FALSE, test]
    

    上面的输出结果的代码sn-p:

    while ((metaLine = metaRead.readLine()) != null) {
        metaData = metaLine.split("[ ]+");
        for (int i = 0; i < metaData.length; i++)
            System.out.print(metaData[i] + " ");
        System.out.println();
    }
    

    另外,我使用 Java 8 和 Stream API 编写了您的任务:

    List<String> collect = metaRead
                .lines()
                .flatMap(line -> Arrays.stream(line.split("[ ]+")))
                .collect(Collectors.toList());
    

    最后,还有最直接的方法:

    final int LINES, WORDS;
    String[] metaData = new String[LINES = 5 * (WORDS = 3)]; // I don't like it
    
    int i = 0;
    while ((metaLine = metaRead.readLine()) != null) {
        for (String s : metaLine.split("[ ]+")) metaData[i++] = s;
    }
    

    【讨论】:

    • 不不,即使那样,当我尝试访问 metaDta[0] 时它返回 testtable2testtable2testtable2,它应该是 testtable2 一次。所以后来我使用例如 if (metaData[0] == "tableTest2"){ //do sth }
    • 你知道字符串是通过equals而不是==比较的吗?
    • @OmarFayez,如果文件不包含任何,,为什么要按, 分割?
    • .equals 对不起,一次做多件事并打错了。我做了你写的,然后打印出长度是1而不是3。另外我想要的不是3个带行的数组,我想要15个数组单元格,每个单元格都有对应的值。
    • @OmarFayez,将数组用于这些目的并不是最好的方法,因为您不知道它的确切大小(new String [100000] 不是一个选项)
    【解决方案2】:

    在 for 循环中更正您的代码,

    System.out.println(metaData[0]);
    

    作为

    System.out.println(metaData[i]);
    

    【讨论】:

      【解决方案3】:

      虽然我的回答可能不完全符合你的问题。但正如我所见,您的文件格式是 TSV 或 CSV。 也许您应该考虑使用 OpenCSV 解决您的问题。

      图书馆会为你处理阅读、拆分过程。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-04-17
        • 1970-01-01
        • 2016-10-17
        • 1970-01-01
        • 1970-01-01
        • 2014-11-17
        • 2011-01-10
        相关资源
        最近更新 更多