【发布时间】:2018-06-13 01:12:40
【问题描述】:
我正在尝试比较两个巨大的 CSV 文件。第一个文件 (id.csv) 由用户 ID 组成,第二个文件 (data.csv) 由原始数据组成。我正在尝试迭代第一个文件中的每个 id 并从第二个文件中找到相同 id 的所有原始数据并写入新文件。我已经尝试了以下简单代码,但我认为这将需要一个多月的时间来处理。请帮助实现可以更快处理的代码。
public class FilterUser {
public static String UniqueUser = "D:/test/id.csv";
public static String Raw = "D:/test/data.csv";
public static String OutputFile = "D:/test/output.csv";
public static void main(String[] args) throws IOException
{
Scanner ScanIn1 = null;
String users = "";
String[] record;
ArrayList<String> InArray = new ArrayList<>();
String line;
long startTime = System.currentTimeMillis();
try{
ScanIn1 = new Scanner(new BufferedReader(new FileReader(UniqueUser)));
BufferedReader br = new BufferedReader(new FileReader(Raw));
BufferedWriter bw = new BufferedWriter(new FileWriter(OutputFile));
bw.write("id,date,time,Use_duration,book1,book2");
bw.newLine();
while(ScanIn1.hasNext()){
users = ScanIn1.nextLine();
InArray.add(users);
}
while((line = br.readLine()) != null){
record = line.split(",");
for(int i=0; i<InArray.size(); i++){
if(InArray.get(i).equals(record[0])){
String output = record[0] + "," + record[1] + "," + record[2] + "," + record[3] + "," + record[4]+ "," + record[5];
bw.write(output);
bw.newLine();
}
}
}
br.close();
bw.close();
ScanIn1.close();
}
catch (FileNotFoundException ex){
System.out.println(ex);
}
catch (IOException ex){
System.out.println(ex);
}
long endTime = System.currentTimeMillis();
long TotalTime = endTime - startTime;
System.out.println("Total time =" + TotalTime);
}
}
id.csv
data.csv
【问题讨论】:
-
对文件进行排序将有助于减少研究(使用排序集和二进制搜索)。您可以使用一个小型数据库来帮助您进行连接(如 SQLITE)。如果没有关于文件的更多信息,真的不能说更多(这需要一个月的时间,这应该超过 1 TB 的数据......)。 PS:标题中提到的地图和布景在哪里?
-
@AxelH 是的,第一个文件是 0.5GB,第二个文件是 15GB。实际上,我提到了地图和集合,以询问我如何实现它们以更快地运行此代码。
-
你的 id 值总是 3 位数字吗??
-
在两个文件中都按 ID 排序是不可靠的吗?如果是这样,只需同时迭代这两个文件。
-
@Nithin 我的 id 值包含 10 位数字,感谢您帮助我,我会尝试使用您重写的代码。
标签: java csv hashmap compare hashset