2014-03-06 37 views
1

我正在使用LumenWorks awesome CSV閱讀器處理CSV文件。一些文件有超過100萬條記錄。使用LumenWorks解析器處理從預定行/行開始的CSV文件

我想要的是分段處理文件。例如。我想先處理100,000條記錄,驗證數據,然後通過Internet連接發送這些記錄。一旦發送,我然後重新打開文件並從記錄100,001繼續。一直到我完成處理文件。在我的應用程序中,我已經創建了跟蹤當前正在處理的記錄的邏輯。

LumenWorks語法分析器是否支持從CSV中的預定行開始處理,還是始終從頂部開始?我看到它有一個緩衝區變量。有沒有辦法使用這個緩衝區變量來實現我的目標?

my_csv = New CsvReader(New StreamReader(file_path), False, ",", buffer_variable) 

回答

2

看來LumenWorks CSV Reader需要在頂部開始 - 我需要忽略文件的前n行,並試圖通過一個StreamReader這是在正確的位置/行,但得到了Key already existsDictionary錯誤,當我試圖得到FieldCount(沒有重複)。

但是,我已經找到了一些成功,首先將預先修剪過的文件讀入StringBuilder,然後再讀入StringReader以允許CSV閱讀器讀取它。你的情況可能與大文件有所不同,但它確實有助於削減一個文件:

   using (StreamReader sr = new StreamReader(filePath)) 
       { 
        string line = sr.ReadLine(); 
        StringBuilder sbCsv = new StringBuilder(); 

        int lineNumber = 0; 

        do 
        { 
         lineNumber++; 

         // Ignore the start rows of the CSV file until we reach the header 
         if (lineNumber >= Constants.HeaderStartingRow) 
         { 
          // Place into StringBuilder 
          sbCsv.AppendLine(line); 
         } 
        } 
        while ((line = sr.ReadLine()) != null); 

        // Use a StringReader to read the trimmed CSV file into a CSV Reader 
        using (StringReader str = new StringReader(sbCsv.ToString())) 
        { 
         using (CsvReader csv = new CsvReader(str, true)) 
         { 
          int fieldCount = csv.FieldCount; 
          string[] headers = csv.GetFieldHeaders(); 
          while (csv.ReadNextRecord()) 
          { 
           for (int i = 0; i < fieldCount; i++) 
           { 
            // Do Work         
           } 
          } 
         } 
        } 
       } 

你也許能夠解決這個適應的文件讀取塊 - 例如當您通讀StreamReader時,請將不同的「塊」分配給StringBuilder對象的Collection,並且如果需要,還預先標記標題行。