如何比较文本文件的每一行? java
How to compare each line of a text File? java
我有一个文本文件,其中包含 792 行的内容:
der 17788648
und 14355959
die 10939606
Die 10480597
现在我想比较 "Die" 和 "die" 的小写是否相等。
因此,如果两个小写字符串相等,则将单词复制到一个新的小写文本文件中,然后对值求和。
预期输出:
der 17788648
und 14355959
die 114420203
到目前为止我有:
try {
BufferedReader bk = null;
BufferedWriter bw = null;
bk = new BufferedReader(new FileReader("outagain.txt"));
bw = new BufferedWriter(new FileWriter("outagain5.txt"));
List<String> list = new ArrayList<>();
String s = "";
while (s != null) {
s = bk.readLine();
list.add(s);
}
for (int k = 0; k < 793; k++) {
String u = bk.readLine();
if (list.contains(u.toLowerCase())) {
//sum values?
} else {
bw.write(u + "\n");
}
}
System.out.println(list.size());
} catch (Exception e) {
System.out.println("Exception caught : " + e);
}
字符串 class 有一个 equalIgnoreCase 方法,您可以使用它来比较两个字符串,而不考虑大小写。所以:
String var1 = "Die";
String var2 = "die";
System.out.println(var1.equalsIgnoreCase(var2));
将打印 TRUE。
而不是 list.add(s);
,使用 list.add(s.toLowerCase());
。现在您的代码正在比较不确定大小写的行和小写行。
如果我答对了你的问题,你想知道如何从文件中获取前缀、比较它、获取它背后的值并为每个前缀求和。这样对吗?
您可以使用正则表达式分别获取前缀和值。然后你可以总结所有具有相同前缀的值并将它们写入每个值的文件。
如果您不熟悉正则表达式,此链接可以帮助您:
如需更多教程,只需扫描 google 以获得 "java regex" 或类似标签。
如果您不想区分大写和小写字符串,只需将它们全部转换为 lower/upper,然后再按照@spork 的解释进行比较。
使用 HashMap 来跟踪唯一字段。在你做一个看跌期权之前,做一个 get 看看这个值是否已经存在。如果是,将旧值与新值相加并再次放入(这将替换具有相同键的旧行)
package com.foundations.framework.concurrency;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
public class FileSummarizer {
public static void main(String[] args) {
HashMap<String, Long> rows = new HashMap<String, Long>();
String line = "";
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader("data.txt"));
while ((line = reader.readLine()) != null) {
String[] tokens = line.split(" ");
String key = tokens[0].toLowerCase();
Long current = Long.parseLong(tokens[1]);
Long previous = rows.get(key);
if(previous != null){
current += previous;
}
rows.put(key, current);
}
}
catch (IOException e) {
e.printStackTrace();
}
finally {
try {
reader.close();
Iterator<String> iterator = rows.keySet().iterator();
while (iterator.hasNext()) {
String key = iterator.next().toString();
String value = rows.get(key).toString();
System.out.println(key + " " + value);
}
}
catch (IOException e) {
e.printStackTrace();
}
}
}
}
对于 Java8,读取文件、比较、分组、收集等标准问题的最佳方法是使用流 api,因为这样做更加简洁方法。至少当文件只有几 KB 时,不会有问题。
类似于:
Map<String, Integer> nameSumMap = Files.lines(Paths.get("test.txt"))
.map(x -> x.split(" "))
.collect(Collectors.groupingBy(x -> x[0].toLowerCase(),
Collectors.summingInt(x -> Integer.parseInt(x[1]))
));
首先,您可以使用 Files.lines()
读取文件,其中 returns 一个 Stream<String>
,然后您可以将字符串拆分为 Stream<String[]>
,
最后,您可以使用 groupingBy()
和 summingInt()
函数按数组的第一个元素分组并按第二个元素求和。
如果您不想使用流 API,您也可以创建一个 HashMap
并在循环中手动进行求和。
我有一个文本文件,其中包含 792 行的内容:
der 17788648
und 14355959
die 10939606
Die 10480597
现在我想比较 "Die" 和 "die" 的小写是否相等。 因此,如果两个小写字符串相等,则将单词复制到一个新的小写文本文件中,然后对值求和。
预期输出:
der 17788648
und 14355959
die 114420203
到目前为止我有:
try {
BufferedReader bk = null;
BufferedWriter bw = null;
bk = new BufferedReader(new FileReader("outagain.txt"));
bw = new BufferedWriter(new FileWriter("outagain5.txt"));
List<String> list = new ArrayList<>();
String s = "";
while (s != null) {
s = bk.readLine();
list.add(s);
}
for (int k = 0; k < 793; k++) {
String u = bk.readLine();
if (list.contains(u.toLowerCase())) {
//sum values?
} else {
bw.write(u + "\n");
}
}
System.out.println(list.size());
} catch (Exception e) {
System.out.println("Exception caught : " + e);
}
字符串 class 有一个 equalIgnoreCase 方法,您可以使用它来比较两个字符串,而不考虑大小写。所以:
String var1 = "Die";
String var2 = "die";
System.out.println(var1.equalsIgnoreCase(var2));
将打印 TRUE。
而不是 list.add(s);
,使用 list.add(s.toLowerCase());
。现在您的代码正在比较不确定大小写的行和小写行。
如果我答对了你的问题,你想知道如何从文件中获取前缀、比较它、获取它背后的值并为每个前缀求和。这样对吗?
您可以使用正则表达式分别获取前缀和值。然后你可以总结所有具有相同前缀的值并将它们写入每个值的文件。
如果您不熟悉正则表达式,此链接可以帮助您:
如需更多教程,只需扫描 google 以获得 "java regex" 或类似标签。
如果您不想区分大写和小写字符串,只需将它们全部转换为 lower/upper,然后再按照@spork 的解释进行比较。
使用 HashMap 来跟踪唯一字段。在你做一个看跌期权之前,做一个 get 看看这个值是否已经存在。如果是,将旧值与新值相加并再次放入(这将替换具有相同键的旧行)
package com.foundations.framework.concurrency;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
public class FileSummarizer {
public static void main(String[] args) {
HashMap<String, Long> rows = new HashMap<String, Long>();
String line = "";
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader("data.txt"));
while ((line = reader.readLine()) != null) {
String[] tokens = line.split(" ");
String key = tokens[0].toLowerCase();
Long current = Long.parseLong(tokens[1]);
Long previous = rows.get(key);
if(previous != null){
current += previous;
}
rows.put(key, current);
}
}
catch (IOException e) {
e.printStackTrace();
}
finally {
try {
reader.close();
Iterator<String> iterator = rows.keySet().iterator();
while (iterator.hasNext()) {
String key = iterator.next().toString();
String value = rows.get(key).toString();
System.out.println(key + " " + value);
}
}
catch (IOException e) {
e.printStackTrace();
}
}
}
}
对于 Java8,读取文件、比较、分组、收集等标准问题的最佳方法是使用流 api,因为这样做更加简洁方法。至少当文件只有几 KB 时,不会有问题。 类似于:
Map<String, Integer> nameSumMap = Files.lines(Paths.get("test.txt"))
.map(x -> x.split(" "))
.collect(Collectors.groupingBy(x -> x[0].toLowerCase(),
Collectors.summingInt(x -> Integer.parseInt(x[1]))
));
首先,您可以使用 Files.lines()
读取文件,其中 returns 一个 Stream<String>
,然后您可以将字符串拆分为 Stream<String[]>
,
最后,您可以使用 groupingBy()
和 summingInt()
函数按数组的第一个元素分组并按第二个元素求和。
如果您不想使用流 API,您也可以创建一个 HashMap
并在循环中手动进行求和。