将每行的逗号分隔文件拆分为Array

时间:2023-01-28 00:16:54

Goal: I'm trying to process a .txt file into a String[]. File must be read per line, spliced on "," and stored in array. Each element (6 elements per line) must have it's own index in the array and must individually be accessible.

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

File (partially):

档案(部分):

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

Code so far:

代码到目前为止:

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);
}

Output so far:

目前为止的输出:

391
20141231
24
20
1
0

391 20141231 24 20 1 0

Which is exactly what I need, but for every line (stored in a String array). Only the last line of the file is stored in the array using the code above.

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

I've already tried the suggestions here and here. Any suggestions or hints?

我已经在这里和这里尝试过这些建议。有什么建议或提示吗?

5 个解决方案

#1


1  

This should work:

这应该工作:

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);
}

#2


4  

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

This line just replaces existing elements, so you need to append elements, never do = to add elements to list variable.

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

Probably this can help:

这可能会有所帮助:

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

#3


2  

You should try using this.

你应该尝试使用它。

    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;
}

#4


1  

If you're using Java7, you could use the new Files API to read the file more easily:

如果您使用的是Java7,则可以使用新的Files 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;
}

If you're using Java8, you can combine that with the new Streams API like so:

如果您使用的是Java8,则可以将其与新的Streams 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());
}

#5


0  

You can use a two dimensional array of String to represent the table you are trying to read. I use an ArrayList to read the file since you won't know how many rows you have until reaching the end of the file. I convert the ArrayList to an array at the end of the code sample.

您可以使用String的二维数组来表示您尝试读取的表。我使用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

Output:

输出:

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

#1


1  

This should work:

这应该工作:

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);
}

#2


4  

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

This line just replaces existing elements, so you need to append elements, never do = to add elements to list variable.

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

Probably this can help:

这可能会有所帮助:

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

#3


2  

You should try using this.

你应该尝试使用它。

    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;
}

#4


1  

If you're using Java7, you could use the new Files API to read the file more easily:

如果您使用的是Java7,则可以使用新的Files 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;
}

If you're using Java8, you can combine that with the new Streams API like so:

如果您使用的是Java8,则可以将其与新的Streams 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());
}

#5


0  

You can use a two dimensional array of String to represent the table you are trying to read. I use an ArrayList to read the file since you won't know how many rows you have until reaching the end of the file. I convert the ArrayList to an array at the end of the code sample.

您可以使用String的二维数组来表示您尝试读取的表。我使用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

Output:

输出:

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