使用Java将文本文件中的数据保存到数组中

时间:2018-05-05 18:20:51

标签: java arrays

我收到了调查结果的文本文件:

Survey_results

我已经设法让Java读取它并使用此代码显示正常:

    import java.io.*;
    class Final {
    public static void main (String [] args) throws Exception {
    File file = new File ("C:\\Users\\loren\\Desktop\\t\\respuestas.txt");
    BufferedReader br = new BufferedReader(new FileReader(file));
    String st; 
      while ((st=br.readLine()) !=null)
      System.out.println(st);
}
}

但我无法弄清楚如何将其保存在2D阵列上,是否有人有任何可能的解决方案?

3 个答案:

答案 0 :(得分:2)

有很多方法可以做到这一点。为了有效地将文件内容放入二维(2D)阵列,您需要知道您的阵列需要多大才能将所有内容正确地装入其中,以免遇到生成 ArrayOutOfBoundsException 。在将元素放入其中之前,需要建立Array的大小。需要考虑的事项是:

  • 这是开头的正确文本文件吗?
  • 文件中有多少有效数据?
  • 每行有多少列?
  • 文件中是否有不需要的行(如标题行) 或空行)?

这就是为什么使用像ArrayList,Map,HashMap等收集机制是解决这个问题的好方法。完成检索数据后,您始终可以将该集合转换为数组。

通过查看您的示例文件(以及它的图像:/),看起来有一个标题行,它简要描述了每个文件行中每个数据列的用途。您没有指定是否要将其作为2D数组的一部分。您也没有为2D数组指定数据类型,它是Object,String还是整数?

考虑到上述情况,我们必须假设您不希望将标题行放入数组中,并且您只需要包含在每个行列中的原始整数数据值。然后,它回答了数据数据类型问题.... Integer(int)。

以下是执行任务的一种方法:

public int[][] readDataFile(String filePath) throws FileNotFoundException {
    ArrayList<int[]> list;
    // Try with resources...Auto closes scanner
    try (Scanner sRead = new Scanner(new File(filePath))) {
        list = new ArrayList<>();
        String line;
        int lineCounter = 0;
        while (sRead.hasNextLine()) {
            line = sRead.nextLine().trim();
            // Skip any blank lines
            if (line.equals("")) { continue; }
            lineCounter++;
            // Is it a valid data file?
            if (lineCounter == 1 && !line.startsWith("P1")) {
                // No it's not!
                JOptionPane.showMessageDialog(null, "Invalid Data File!",
                        "Invalid File!",
                        JOptionPane.WARNING_MESSAGE);
                return null;
            }
            // Skip the Header Line
            else if (line.startsWith("P1")) { continue; }

            // Split the incomming line and convert the
            // string values to int's
            String[] strArray = line.split("\\s+");
            int[] intArray = new int[strArray.length];
            for(int i = 0; i < strArray.length; i++) {
                intArray[i] = Integer.parseInt(strArray[i]);
            }
            // Add to ArrayList
            list.add(intArray);
        }
    }

    // Convert the ArrayList to a 2D int Array
    int[][] array = new int[list.size()][list.get(0).length];
    for (int i = 0; i < list.size(); i++) {
        System.arraycopy(list.get(i), 0, array[i], 0, list.get(i).length);
    }
    return array;
}

要使用此方法,您可以使用:

try {
    int[][] a = readDataFile("C:\\Users\\loren\\Desktop\\t\\respuestas.txt");
    for (int[] a1 : a) {
        System.out.println(Arrays.toString(a1));
    }
} catch (FileNotFoundException ex) { ex.printStackTrace(); }

答案 1 :(得分:1)

使用String数组列表,然后将此列表转换为2D String数组 在这种情况下,&#34;结果&#34;将是您想要的输出。
假设:输入文件中的单词由选项卡

分隔
import java.io.*;
import java.util.List;
import java.util.ArrayList;
class Final {
    public static void main (String [] args) throws Exception {
        File file = new File ("C:\\Users\\loren\\Desktop\\t\\respuestas.txt");
        BufferedReader br = new BufferedReader(new FileReader(file));
        String st;
        List<String[]> resultList = new ArrayList<>();
        while ((st=br.readLine()) !=null) {
            resultList.add(st.split("\t"));
        }
        String[][] result = new String[resultList.size()][resultList.get(0).length];
        for(int i=0; i<resultList.size(); i++) {
            result[i] = resultList.get(i);
        }
    }
}

答案 2 :(得分:0)

1 - 逐行读取文件数据

import java.io.*;

public class FileReader {

    private String fileName, fileContent = null, line;

    public FileReader(String f) {
        fileName = f;
        reader();
    }

    private void reader() {
        try {
            fileContent = "";
            // FileReader reads text files in the default encoding
            Reader fileReader = new java.io.FileReader(fileName);

            // Wrapping FileReader in BufferedReader
            BufferedReader bufferedReader = new BufferedReader(fileReader);

            while ((line = bufferedReader.readLine()) != null) {
                fileContent += line;
                fileContent += '\n';
            }

            // Closing the file
            bufferedReader.close();
        } catch (FileNotFoundException ex) {
            System.out.println("Unable to open file '" + fileName + "'");
        } catch (IOException ex) {
            System.out.println("Error reading file '" + fileName + "'");
        }
    }

    /**
     * Get content of file
     * 
     * @return String
     */
    public String getFileContent() {
        return fileContent;
    }

}

2-Loop over lines并将它们添加到数组的特定索引中!你需要一个在每一行中跳过空格并只提取值的函数。