如何将CSV文件按第6列拆分为两个List集合?
提取CSV每行第6列存入List的解决方案
你的问题回顾
你当前的代码能把CSV文件的所有行读取到lines列表,但误用了Take(6)/Skip()(这两个是用来操作行数量的),真正想要实现的是提取每行的第6列内容,存入第二个List。
你的原始代码片段:
//new List List<string> lines = new List<string>(); List<string> lines2 = new List<string>(); // read and write data to list for (int i = 0; i < fileName.Length; i++) { string file = @"read\" + Path.GetFileName(fileName[i]); // load rows to list. lines = File.ReadLines(file).ToList(); foreach (string line in lines) { // Variablen für lines string[] entries = line.Split(';'); int length = entries.Length; } }
正确实现方式
核心思路是:对每行拆分后的数组,取索引为5的元素(C#数组从0开始计数,第6列对应索引5),然后添加到lines2中。同时一定要加长度判断,避免索引越界报错。
方式1:在foreach循环中逐行添加
修改你的foreach部分即可:
foreach (string line in lines) { string[] entries = line.Split(';'); // 先检查数组长度,避免索引越界 if (entries.Length >= 6) { // 第6列是索引5,添加到lines2 lines2.Add(entries[5]); } else { // 可选:处理列数不足的情况,比如添加空字符串或者跳过 lines2.Add(string.Empty); // 或者直接 continue; 跳过该行 } }
方式2:用LINQ一次性生成(更简洁)
如果喜欢LINQ风格,可以直接在读取行的时候就完成提取,不需要先存lines:
// 替换原有的lines赋值和foreach部分 lines2.AddRange( File.ReadLines(file) .Select(line => { var entries = line.Split(';'); return entries.Length >= 6 ? entries[5] : string.Empty; }) );
关键说明
Take(6)是取前6行,Skip(6)是跳过前6行,它们都是针对行集合的操作,和列无关,这是你之前误解的点。- 一定要加
entries.Length >=6的判断,不然如果某行数据列数不足,会抛出IndexOutOfRangeException异常。
内容的提问来源于stack exchange,提问作者Hakunama Tatarov
相关产品推荐
相关产品推荐

