2013-03-31 42 views
2

我現在用的是CSVHelper庫,它可以從一個CSV提取對象的列表只有三行代碼文件:如何作爲TextReader傳遞字符串集合?

var streamReader = // Create a reader to your CSV file. 
var csvReader = new CsvReader(streamReader); 
List<MyCustomType> myData = csvReader.GetRecords<MyCustomType>(); 

不過,文件中有廢話行,我需要跳過前十行在文件中。我認爲這將是很好使用LINQ,以確保「乾淨」的數據,然後將數據傳遞給CsvFReader,像這樣:

public TextReader GetTextReader(IEnumerable<string> lines) 
{ 
    // Some magic here. Don't want to return null; 
    return TextReader.Null; 
} 
public IEnumerable<T> ExtractObjectList<T>(string filePath) where T : class 
{ 
    var csvLines = File.ReadLines(filePath) 
         .Skip(10) 
         .Where(l => !l.StartsWith(",,,")); 
    var textReader = GetTextReader(csvLines); 
    var csvReader = new CsvReader(textReader); 
    csvReader.Configuration.ClassMapping<EventMap, Event>(); 
    return csvReader.GetRecords<T>(); 
} 

但我真的堅持到通過推絃的「靜態」集合流如TextReaer

我的另一個選擇是通過CsvReader逐行處理CSV文件,並在提取對象之前檢查每一行,但我覺得有點笨拙。

+0

我可能會去第二個選項,那麼你不需要把整個文件保存在內存中(就像你現在正在做的那樣) – Magnus

+0

是的,考慮到它,我同意。該文件是用於停車場的,那些使用非現金系統的入口,並且來自全國各地,並且一定會相當大。儘管這是看不見的選擇。上面的第二個選項仍然是一次全部正確記錄的過程。 – ProfK

回答

4

StringReader類提供了一個包裝String的TextReader。你可以簡單地加入線和包裝他們在一個StringReader:

public TextReader GetTextReader(IEnumerable<string> lines) 
{ 
    return new StringReader(string.Join("\r\n", lines)); 
} 
+0

我剛纔發現的。我仍然想在一個phat LINQ查詢中完成整個任務,因爲我想這樣做,但這很好,謝謝。 – ProfK

-1

你可以試試這個辦法 - 將字符串轉換的收集到字節數組,將它們連接起來,並建立它的流:

private static TextReader GetTextReader(IEnumerable<string> lines) 
{    
    var encoding = System.Text.Encoding.Unicode; 

    var bytesarrays = lines.Select(encoding.GetBytes); 
    var bytes = bytesarrays.SelectMany(i => i).ToArray(); 
    var stream = new MemoryStream(bytes); 
    return new StreamReader(stream, encoding);   
} 
+0

對不起,我以前的錯誤,我沒有考慮編碼。現在已經解決了。 – jwaliszko

+1

爲什麼要打擾字節?只是連接字符串? – ProfK

相關問題