将每行以逗号分隔的文件拆分为数组
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());
}
目标: 我正在尝试将 .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());
}