2017-08-03 47 views
0

所以一個尋找解決方案,這個和一些人已經問了,但我不知道他們的答案是否適合我?我複製此代碼並將其粘貼到我的類的構造函數中的一個:c#:如何讀取每行多個元素的CSV文件並放入數組?爲什麼不Split()工作?

var Lines = File.ReadLines("C:\\Users\\k20\\Source\\Repos\\TS_Webform\\TS_Webform\\Forms\\emails.csv").Select(a => a.Split(';')); 
var CSV = from line in Lines select (line.Split(',')).ToArray(); //error on "Split" 

我收到此錯誤信息:

「錯誤CS1061‘字符串[]’不包含‘拆分’的定義。並沒有擴展方法「分裂」接受一個類型的第一個參數「弦[]」可以找到(是否缺少using指令或程序集引用?)」

在寫我的csv文件,第一線被完全跳過,然後第2行和以後將有5個元素ts寫爲:[email protected],example,15555555555,1234567890,1234567890 每增加一個就是這樣。我不確定第一個跳過的行如何影響我的代碼。

+0

在第一行中,嘗試用實際類型替換'var',你會看到有什麼問題......(提示:'Lines'是一個'IEnumerable ',而不是'IEnumerable ',因爲你'在末尾重複調用'Split(';')') –

+0

你得到的每一行都是字符串[]而不是字符串,因爲你已經完成拆分選擇(a => a.Split(';')) – Xiaosu

回答

0

這個錯誤是因爲你已經在你的第一行之前曾經呼籲分裂:

var Lines = 
    File 
    .ReadLines("C:\\Users\\k20\\Source\\Repos\\TS_Webform\\TS_Webform\\Forms\\emails.csv") 
    .Select(a => a.Split(';')); // <--- This is causing your problem. 

所以LinesIEnumerable<string[]>。然後您嘗試枚舉每個string[]並調用Split就可以了,但string[]沒有這樣的功能。

一般來說,這是解析CSV文件的一種天真的方法。如果其中一個值包含逗號,會發生什麼:

「例如,像這樣的」

在這種情況下,你最終會分裂你的價值。你知道你的數據,所以你可以肯定地說,這不會是一個問題。如果太棒了。如果沒有,我會檢查NuGet的現有包,可以幫助你做到這一點。

更新

根據您的意見,這可能就足夠了:

var csv = 
    File 
    .ReadLines("C:\\Users\\k20\\Source\\Repos\\TS_Webform\\TS_Webform\\Forms\\emails.csv") 
    .Select(line => line.Split(',')) 
    .ToArray(); 

在此之後csv意願string[][]類型。但正如我所說,如果你懷疑你的價值觀可能包含逗號,這是不夠的。檢查these NuGet包之一。

+0

所以我應該只是刪除它? –

+0

@凱文塞拉諾 - 好吧,就像我說的,如果你確定知道這不會是一個問題,那麼太棒了。即使您懷疑這可能是一個問題,您仍應該能夠整理一些邊緣案例(可能不僅僅是LINQ)。否則,請檢查NuGet。順便說一下,你爲什麼分裂';'在第一行? –

+0

我剛剛複製了這段代碼,我不知道它是怎麼回事。我不知道選擇什麼(a => a.Split(','))我假設它就像在java中使用分隔符或「從行中的行」所做的一樣。我只是認爲我會替換不適用於適用於我的東西。 –

2

正如我在評論中指出的那樣,LinesIEnumerable<string[]>,而不是IEnumerable<string>,因爲您在最後調用Split(';')

要解決此問題,您可以使用SelectMany,這將捕獲的所有項目從第一Split(';')並將它們添加到Lines列表:

var Lines = File 
    .ReadLines(@"C:\Users\k20\Source\Repos\TS_Webform\TS_Webform\Forms\emails.csv") 
    .SelectMany(a => a.Split(';')); 

或者,如果你知道你想要僅僅是第一項,例如,從原來的分裂,那麼你可以使用索引語法([0])選擇它:

var Lines = File 
    .ReadLines(@"C:\Users\k20\Source\Repos\TS_Webform\TS_Webform\Forms\emails.csv") 
    .Select(a => a.Split(';')[0]); 

而且,考慮使用一個庫,像File Helpers解析CSV文件。 Split可能會導致一些問題,如果您不確定該文件的內容。

相關問題