我目前正在寫的轉讓是需要多個文本文件(File對象)用線,然後結合線齊發用逗號將它們分開,如:打印多個文件到CSV
File1Line1, File2Line1
File1Line2, File2Line2
我猜我只是混淆如何使用這些文件。我如何從每個文件中獲得第一行(第二,第三等),同時還處理具有不同行數的文件?任何幫助只是在這個概念是讚賞。
我目前正在寫的轉讓是需要多個文本文件(File對象)用線,然後結合線齊發用逗號將它們分開,如:打印多個文件到CSV
File1Line1, File2Line1
File1Line2, File2Line2
我猜我只是混淆如何使用這些文件。我如何從每個文件中獲得第一行(第二,第三等),同時還處理具有不同行數的文件?任何幫助只是在這個概念是讚賞。
至於逐行讀取文件,在大多數語言中很容易。以下是java中的一個示例:How to read a large text file line by line using Java?。
從概念上講,您應該先考慮算法,然後編寫一些僞代碼以進一步探索和理解它。
對於這個任務,一個選項是交替讀取每個文件一行一行,然後立即將它們寫入csv。第二種選擇是將每行存儲在數據結構中,比如數組,然後寫在最後,但是對於大文件來說這可能會很昂貴。您可以通過多種方式處理不同的文件長度,例如僅編寫沒有相應行的行。下面是一些僞代碼,基於java:
FileReader reader1 = FileReader("file1.text")
FileReader reader2 = FileReader("file2.text")
while(reader1.hasNextLine() || reader2.hasNextLine())
{
if(reader1.hasNextLine()) {
writeToCSV(reader1.nextLine());
}
if(reader2.hasNextLine() {
writeToCSV(reader2.nextLine());
}
writeToCSV("\r\n");
}
你可以找到大量的實際方法調用的例子,但首先了解該算法是非常重要的。
如果您確定兩個文件的行是一對一映射,那麼很容易。
您可以使用兩種BuffererReader閱讀這兩個文件,你只需要遍歷其中之一
一些代碼是這樣的:
BufferedReader reader1 = new BufferedReader(new FileReader(new File(pathOfFile1)));
BufferedReader reader2 = new BufferedReader(new FileReader(new File(pathOfFile2)));
BufferedWriter writer = new BufferedWriter(new FileWriter(new File(pathOfOutputCsvFile)));
String lineOfFile1 = null;
while((lineOfFile1 = reader1.readLine()) != null){
String lineOfFile2 = reader2.readLine();
//here, lineOfFile1 and lineOfFile2 are the same line number
//then some codes for combination
//...
}
//finally don't forget to close the readers and writer.
如果你不能確定的行這兩個文件是一對一映射,那麼您應該將它們全部讀入內存並將它們映射到內存中,然後將它們輸出爲CSV文件。
此代碼一次只直接引用RAM中每個文件的1行,這意味着它應該可以在沒有內存異常的情況下處理大型文件。在幕後可能會佔用比您所看到的更多的內存,但它仍然不會與大文件崩潰。
代碼通過從每個文件一次讀取一行直到所有文件都爲空來工作。當文件用盡時,輸出空字符串。
void assignment(String outputFile, String... filenames){
PrintWriter writer = new PrintWriter(outputFile, "UTF-8");
Scanner scanners = new Scanner[filenames.length];
for(int i=0;i<filenames.length;i++){
Scanner scanner = new Scanner(new File(filenames[i]));
scanners[i] = scanner;
}
boolean running = true;
while(running){
boolean allEmpty = true;
StringBuilder csvLine = new StringBuilder();
for(int i=0;i<scanners.lengh;i++){
if(scanner.hasNextLine()){
String line = scanner.nextLine();
csvLine.append(line);
allEmpty=false;
}
if(i!=scanners.length-1) csvLine.append(",");
}
if(allEmpty)
running=false;
else
writer.println(csvLine.toString());
}
writer.close();
for(Scanner s : scanners) s.close();
}
用法:
assignment("output.txt","file1.txt","file2.txt","file3.txt","file4.txt");
或者:
String[] args = new String[]{"helloWorld.txt","fun.bin"};
assignment("output2.txt",args);
此代碼是未經測試,並且不處理異常。此代碼可讓您從行中不匹配的文件中讀取行,並將它們合併到一個CSV文件中。由於文件運行不足,只會顯示空字符串。
這應該讓你知道如何精確地完成你所要求的內容。
你能分享代碼而不是分配嗎? –