我必须读取一个具有特定字段数的csv文件,我必须遍历并检测第一列的连续字符串(我已经使用数组读取了文件),并且仅对于这些字符串,我想在文件的第三列中获取它们的int值的总和,我已将它们存储到另一个数组中。到目前为止,我能够检测连续的相同字符串,但是如何获取它们的值并获取每个字符串的总和?可以同时遍历吗?我没有Java方面的经验,请帮忙。谢谢。 这是我的代码。 csv文件类似这样,具有随机值:
ip, timestamp,elapsed,..
127.0.0.1,...,1500
127.0.0.2,...,2800
127.0.0.2,...,2400
127.0.0.2,...,2500
127.0.0.3,...,1700
127.0.0.4,...,1600
127.0.0.4,...,1500
127.0.0.5,...,2000
我必须得到这样的东西:127.0.0.2:7700,127.0.0.4:3100
public static void main(String[] args) {
try {
System.out.println("Give file's name: ");
Scanner in = new Scanner(System.in);
String filename = in.nextLine();
File file = new File(filename);
Scanner inputfile = new Scanner(file);
String csv_data[];
ArrayList<String> ip_list = new ArrayList<String>();
ArrayList<String> elapsed_list = new ArrayList<String>();
String[] ip_array = new String[ip_list.size()];
String[] elapsed_array = new String[elapsed_list.size()];
int i = 0;
int j = 0;
int sum = 0;
while (inputfile.hasNextLine()) {
String line = inputfile.nextLine();
csv_data = line.split(",");
ip_list.add(csv_data[0]);
elapsed_list.add(csv_data[2]);
}
ip_array = ip_list.toArray(ip_array);
elapsed_array = elapsed_list.toArray(elapsed_array);
for (String element : elapsed_array) {
try {
int num = Integer.parseInt(element);
} catch (NumberFormatException fe) {
fe.printStackTrace();
System.out.println(" That's not a number");
}
}
while (i < ip_array.length) {
int start = i;
while (i < ip_array.length && (ip_array[i].equals(ip_array[start]))) {
i++;
}
int count = i - start;
if (count >= 5) {
System.out.println(ip_array[start] + " " + "|" + " " + count);
}
}
} catch (FileNotFoundException ex) {
ex.printStackTrace();
}
}
答案 0 :(得分:0)
public static void main(String[] args) throws Exception {
List<Data> data = read(getFile());
Map<String, Integer> idSum = groupByIdWithSum(data);
// ...
}
private static File getFile() throws Exception {
try (Scanner scan = new Scanner(System.in)) {
System.out.println("Give file's name: ");
return new File(in.nextLine());
}
}
private static List<Data> read(File file) throws Exception {
try (Scanner scan = new Scanner(file)) {
List<Data> res = new ArrayList<>();
while(scan.hasNextLine()){
String[] lineParts = scan.nextLine().splie(",");
res.add(new Data(lineParts[0], Integer.parseInt(lineParts[2])));
}
return res;
}
}
private static Map<String, Integer> groupByIdWithSum(List<Data> data) {
Map<String, Integer> map = new HashMap<>();
for(Data d : data)
map.put(d.getId(), map.getOrDefault(d.getId(), 0) + d.getElapsed());
return map;
}
final static class Data {
private final String ip;
private final int elapsed;
public Data(String ip, int elapsed) {
this.ip = ip;
this.elapsed = elapsed;
}
public String getId() {
return id;
}
public int getElapsed() {
return elapsed;
}
}