将每行以逗号分隔的文件拆分为数组

Split comma-separated file per line into Array

目标: 我正在尝试将 .txt 文件处理成 String[]。必须逐行读取文件,拼接“,”,存入数组。每个元素(每行 6 个元素)在数组中必须有自己的索引,并且必须可以单独访问。

文件(部分):

210,20140101,    1,   60,   67,   -1
210,20140101,    2,   60,   65,    0
210,20140101,    3,   60,   58,    0
210,20140101,    4,   60,   56,    0
210,20140101,    5,   60,   49,    0
210,20140101,    6,   60,   53,    0
210,20140101,    7,   60,   55,    0
210,20140101,    8,   70,   59,    0

目前代码:

try (BufferedReader br = new BufferedReader(new FileReader(path))) {
    for (String line; (line = br.readLine()) != null;) {
        counter++;
        if (counter > 51) {
            line = br.readLine();
            line = line.trim();
            list = Arrays.asList(line.split("\s*,\s*"));
        }
    }
}

for (String x : list) {
    System.out.println(x);
}

到目前为止的输出:

391
20141231
24
20
1
0

这正是我所需要的,但对于每一行(存储在一个字符串数组中)。使用上面的代码,只有文件的最后一行存储在数组中。

我已经尝试了这些建议 here and here。 有什么建议或提示吗?

list = Arrays.asList(line.split("\s*,\s*"));

这一行只是替换现有的元素,所以你需要追加元素,永远不要=将元素添加到list变量。

这可能会有所帮助:

list.addAll(Arrays.asList(line.split("\s*,\s*")));

您可以使用 String 的二维数组来表示您要阅读的 table。我使用 ArrayList 来读取文件,因为在到达文件末尾之前您不会知道有多少行。我在代码示例末尾将 ArrayList 转换为数组。

List<String[]> resultList = new ArrayList<String[]>();
int counter = 0;
try (BufferedReader br = new BufferedReader(new FileReader(path))) {

    for (String line; (line = br.readLine()) != null;) {
        counter++;

        if (counter > 51) {                           // ignore the first 51 lines
            line = br.readLine();
            line = line.trim();
            resultList.add(line.split("\s*,\s*"));
        }
    }
}

String[][] resultArray = new String[counter][6];      // convert ArrayList of String[]
resultArray = resultList.toArray(resultArray);        // to an array

输出:

System.out.println(resultArray[0][4]); // prints 67
System.out.println(resultArray[4][1]); // prints 20140101
System.out.println(resultArray[6][2]); // prints 7

这应该有效:

try {
    BufferedReader br = new BufferedReader(new FileReader("D:\a.txt"));
    int counter = 0;
    ArrayList<String> list = new ArrayList<String>();
    for (String line; (line = br.readLine()) != null;) {
        counter++;

        if (counter > 51) {
            line = line.trim();
            list.addAll(Arrays.asList(line.split("\s*,\s*")));
        }
    }

    String[] array = new String[list.size()];
    array = list.toArray(array);

    for (int i = 0; i < array.length; i++) {
        System.out.println(array[i]);
    }
} catch(Exception e) {
    System.out.println(e);
}

你应该尝试使用这个。

    private BufferedReader innerReader;
public List<String> loadFrom(Reader reader)
        throws IOException {
    if(reader == null)
    {
        throw new IllegalArgumentException("Reader not found");
    }
        this.innerReader = new BufferedReader(reader);
    List<String> result = new ArrayList<String>();
    String line;
    try
    {
    while((line = innerReader.readLine()) != null)
    {
        if (line == null || line.trim().isEmpty())
            throw new IllegalArgumentException(
                    "line null");

        StringTokenizer tokenizer = new StringTokenizer(line, ",");
        if (tokenizer.countTokens() < 6)
            throw new IllegalArgumentException(
                    "Token number (<= 6)");
        String n1 = tokenizer.nextToken(",").trim();
        String n2 = tokenizer.nextToken(",").trim();
        String n3 = tokenizer.nextToken(",").trim();
        String n4 = tokenizer.nextToken(",").trim();
        String n5 = tokenizer.nextToken(",").trim();
        String n6 = tokenizer.nextToken(",\n\r").trim();
        StringBuilder sb = new StringBuilder();
        sb.append(n1 + "," + n2 + "," + n3 + "," + n4 + "," + n5 + "," + n6);
        result.add(sb.toString());
    }
    } catch (NoSuchElementException e) {
        throw new  IllegalArgumentException(e);
    }
    return result;
}

如果您正在使用 Java7,您可以使用新的文件 API 来更轻松地阅读文件:

public List<List<String>> readValuesJava7() {
  Path path = Paths.get(URI.create("/tmp/coco.txt"));
  List<String> rawLines = new ArrayList<>();
  try {
    rawLines = Files.readAllLines(path);
  } catch (IOException e) {
    e.printStackTrace();
  }
  List<List<String>> lines = new ArrayList<>();
  for (String rawLine : rawLines) {
    List<String> line = new ArrayList<>();
    for (String col : rawLine.split(","))
      line.add(col.trim());
    lines.add(line);
  }
  return lines;
}

如果您正在使用 Java8,您可以将其与新的流 API 结合使用,如下所示:

public List<List<String>> readValuesJava8() {
  Path path = Paths.get(URI.create("/tmp/coco.txt"));
  Stream<String> rawLines = Stream.empty();
  try {
    rawLines = Files.lines(path);
  } catch (IOException e) {
    e.printStackTrace();
  }
  return rawLines
      .map(line -> line.split(","))
      .map(cols -> Stream.of(cols).map(String::trim).collect(Collectors.toList()))
      .collect(Collectors.toList());
}