-1

我目前正在编写一个作业,它需要多个文本文件(文件对象)和行,然后将这些行组合在一起并用逗号分隔它们,例如:

File1Line1, File2Line1
File1Line2, File2Line2

我想我只是对如何使用这些文件感到困惑。如何从每个文件中获取第一(第二、第三等)行,同时处理具有不同行数的文件?对此概念的任何帮助表示赞赏。

4

3 回答 3

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");
    }

您可以找到大量有关实际方法调用的示例,但首先了解算法很重要。

于 2013-07-15T04:00:33.020 回答
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 文件输出。

于 2013-07-15T03:51:31.917 回答
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 文件。当文件用完行时,只会显示空字符串。

这应该让您了解如何准确地按照您的要求进行操作。

于 2013-07-15T03:58:39.887 回答