2017-07-19 102 views
1

使用以下代码我试图读取包含double值的csv文件并将其转换为列表。如果我想打印该列表输出只包含“system.collections.generic.list1 system.string”。我的代码有什么问题?使用c转换csv为双列表#

var filePath = @"C:\Users\amuenal\Desktop\Uni\test.csv"; 

var contents = File.ReadAllText(filePath).Split(';'); 

var csv = from line in contents 
      select line.Split(';').ToList(); 

    foreach (var i in csv) 
    { 
     Console.WriteLine(i); 
    } 
+2

'ReadAllText'会给你一个包含整个文件的大字符串。然后你将它分成“;” (这意味着没有“;”了),然后你再分开“;”(当没有)时,这是不合逻辑的。你的意思是使用'ReadAllLines'吗? – litelite

+0

如果分隔符是“;”那么它是如何一个CSV(逗号分隔值)文件? – Kevin

+0

Jeah,我想将文件的内容读入列表中。所以我需要使用ReadAllLines? – auenal

回答

1

你有几件事情你的代码错误。首先,你应该最有可能使用ReadAllLines()而不是ReadAllText()。其次,你的LINQ查询返回一个List<List<string>>,我想这不是你想要的。我会尝试这样的事情:

var filePath = @"C:\Users\amuenal\Desktop\Uni\test.csv"; 

//iterate through all the rows 
foreach (var row in File.ReadAllLines(filePath)) 
{ 
    //iterate through each column in each row 
    foreach(var col in row.Split(';')) 
    { 
     Console.WriteLine(col); 
    }   
} 
+0

谢谢!有效。 – auenal

0

csv是一个字符串列表的IEnumerable。 (换句话说,每个“我”是一个字符串列表)。

您需要两个循环:

foreach (var list in csv) 
{ 
    foreach(var str in list) 
    { 
     Console.WriteLine(str); 
    } 
} 
+0

@maccettura对,误读了一下。这将是一个列表中的字符串列表,其中内部列表包含一个单独的元素 – litelite

+0

我认为真正的问题是他不应该使用ReadAllText,正如上面的litelite指出的那样。但是,给出的代码确实会产生一个字符串列表的IEnumerable。使用我的代码可能不会给他他期望的结果,但它至少会让他看到一个值而不是类型。 – user1304444

1

这应该很好。希望这可以帮助。

var filePath = @"C:\Users\amuenal\Desktop\Uni\test.csv"; 
var contents = File.ReadAllLines(filePath); 

var csv = (from line in contents 
      select line.Split(';')).SelectMany(x1 => x1); 

foreach (var i in csv) 
{ 
    Console.WriteLine(i); 
}