2013-07-15 129 views
-1

我目前正在写的转让是需要多个文本文件(File对象)用线,然后结合线齐发用逗号将它们分开,如:打印多个文件到CSV

File1Line1, File2Line1 
File1Line2, File2Line2 

我猜我只是混淆如何使用这些文件。我如何从每个文件中获得第一行(第二,第三等),同时还处理具有不同行数的文件?任何帮助只是在这个概念是赞赏。

+6

你能分享代码而不是分配吗? –

回答

1

至于逐行读取文件,在大多数语言中很容易。以下是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"); 
    } 

你可以找到大量的实际方法调用的例子,但首先了解该算法是非常重要的。

0

如果您确定两个文件的行是一对一映射,那么很容易。

您可以使用两种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文件。

0

此代码一次只直接引用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文件中。由于文件运行不足,只会显示空字符串。

这应该让你知道如何精确地完成你所要求的内容。