簡體   English   中英

無法在Java中一次讀取一個文件並一次生成一個輸出CSV

[英]Unable to read one file and generate one output CSV at a time in Java

我正在從一個文件夾讀取文件,每個文件夾可以有多行記錄。 所以我在這里創建兩個arrayList:

List<Address> addressList;
List<List<Address>> addressLists; 

我正在調用readIncomingFiles方法,該方法返回List<List<Address>>

// The code structure of method which reads incomingFiles 
public List<List<Address>> readIncomingFiles() {
    //some lines of code Processing data
    if (!(addressList == null || addressList.size() == 0)) {
        addressLists.add(addressList);
    }
    return  addressLists;
}

現在在addressLists我具有來自所有文件的記錄以及所有記錄。 main方法中,我具有process方法,該方法首先讀取作為所有記錄的對象addressLists 假設有三個文件,每個文件有三個記錄,則總共有9個記錄。

void process() //main method {
    this.addressLists=this.readIncomingFiles();
    List<String> outgoingFileNames = this.getOutgoingFileName();

    //Here I am creating a list for all outgoing files which will be generated and kept in destination folder.from getOutgoingFileName method
    for (String outgoingFile : outgoingFileNames) {
        if(validate file if file contains csv in output generated file name)
             then call ProcessFile
        ProcessFile()
    for (List<AddressDto> listOfAddress : this.addressLists) {
        for (AddressDto address : listOfAddress) {
            this.csvOut = new OutputCsvDataDto();   
           //Process files and Records.
           // Here OutputCsvDataDto returns data drom result generating method which writes records in OutputCsvDataDto List.
}

問題是它在返回List<List<Address>時讀取所有文件和所有記錄,而且方法getoutgoing file一次生成3個輸出文件並返回一個列表。 下面粘貼了outgoingfile方法的代碼結構:

public List<String> getOutgoingFileName {
    for (File incomingFile : incomingFileFolder.listFiles()) {
        outgoingFilenames.add("results_" + incomingFile.getName());
    }
}

如何一次讀取一條記錄? 如果一次讀取一個記錄,我將如何處理其他記錄? 我是Java新手。

我不確定我是否正確理解了您,但讓我們總結一下:

  • 一個文件夾里有很多文件,
  • 這些文件包含可變的行數,
  • 每行都是某種記錄(大概是郵寄地址),
  • 您想要讀取所有這些文件,逐行處理,並將輸出保存到文件中,該文件的名稱以某種方式基於輸入文件

如果以上所有方法都正確,那么首先讓我們從整個過程的修改開始,因為當前您將所有文件讀入內存,而這並不是您真正想要做的。 如果每個文件都占用4GiB怎么辦? 因此,更好的方法是以比“存儲”更多的方式重組“管道”的方式來處理整個事情。

因此,它或多或少是這樣的:

public static void main(String[] args) {
    File incomingDir = new File(args[0]);
    File outgoingDir = new File(args[1]);
    for (File f : incomingDir.listFiles()) {
        processFile(f, outgoingDir);
    }
}

private static void processFile(File incomingFile, File outgoingDir) {
    File outgoingFile = new File(outputDir, "results-" + incomingFile.getName());
    for (String line : /* read lines from incomingFile */) {
        Address address = parseAddress(line);
        /* write address to outgoingFile */
    }
}

private static Address parseAddress(String line) {
    Address address;
    /* do parsing */
    return address;
}

當然,您需要調整代碼,可能在while循環中使用BufferedReader (而不是如上所述的processFilefor循環),但是草繪概念比給出“復制粘貼”答案更為重要。 並考慮如何使此代碼並行工作,如果總是可行的話。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM