C# 读取CSV文件?

C# 读取CSV文件?,c#,.net,vb.net,csv,C#,.net,Vb.net,Csv,我需要解析和排序一个非常大的CSV文件的数据。请注意,该文件确实很大,大约有600K行。我不需要将它存储在某个地方或导入数据库。请指导执行此实施的有效方法。我很感谢你分享经验。我会这样做 var list = new List<float>(10000); using (var fs = new StreamReader(new FileStream("file.csv", FileMode.Open, FileAccess.Read, FileShare.None, 8192, F

我需要解析和排序一个非常大的CSV文件的数据。请注意,该文件确实很大,大约有600K行。我不需要将它存储在某个地方或导入数据库。请指导执行此实施的有效方法。我很感谢你分享经验。

我会这样做

var list = new List<float>(10000);
using (var fs = new StreamReader(new FileStream("file.csv", FileMode.Open, FileAccess.Read, FileShare.None, 8192, FileOptions.SequentialScan)))
{
    var line = fs.ReadLine();
    var columns = line.Split(',');
    list.Add(Convert.ToSingle(columns[5]));
}
// Sort the list and do your calculations...
var列表=新列表(10000);
使用(var fs=new StreamReader(新文件流(“file.csv”、FileMode.Open、FileAccess.Read、FileShare.None、8192、FileOptions.SequentialScan)))
{
var line=fs.ReadLine();
var columns=line.Split(',');
list.Add(Convert.ToSingle(第[5]列));
}
//对列表进行排序并进行计算。。。

请注意
FileOptions.SequentialScan
,还可以使用
bufferSize
(不确定默认值是4096还是8192)来获得更好的结果。。。还可以预先分配列表大小,以防止调整列表的大小…

使用外部排序处理大文件排序的一种方法。有许多CSV库提供了开箱即用的功能

具有具有外部分拣功能的CSVReader。你可以利用它来达到你的目的

a。定义POCO类以表示CSV记录。重要提示:将类标记为可序列化以符合外部排序条件

[Serializable]
public class Customer
{
    [ChoCSVRecordField(1)]
    [Key]
    public int Id { get; set; }
    [ChoCSVRecordField(2)]
    public string Street { get; set; }
    [ChoCSVRecordField(4)]
    public string City { get; set; }
    [ChoCSVRecordField(6)]
    public string Zip { get; set; }
}
b。编写比较器类以对列进行排序(例如,let按城市排序)

公共类地址城市比较者:IComparer
{
公共整数比较(客户x、客户y)
{
返回字符串.Compare(x.City,y.City);
}
}
c。最后,使用ChoCSVReader加载CSV文件。将其传递给ExternalSorting方法对其进行排序

foreach (var e in new ChoCSVReader<Customer>("Test.txt").WithDelimiter("\t").ExternalSort(new AddressCityComparer()))
    Console.WriteLine(e.City);
foreach(新的ChoCSVReader(“Test.txt”)中的变量e。带分隔符(“\t”)。外部排序(new AddressCityComparer())
控制台。WriteLine(东城);

希望这能有所帮助。

如果只需要中值,为什么需要排序?阅读以获得CSV上的全貌,然后搜索将根据RFC 4180处理CSV数据的库最好的方法是将数字读取到列表对象中,这样可以减小大小。输入sting比解析的数字占用更多内存。获得值的总数后,无需对整个数组进行排序即可获得中值。你只需要对一半的项目进行冒泡排序就可以得到中间值。“不排序就找不到中间值”——对于内存集合,你可以使用AlgorithmThank@Michael,我可以只读一列吗?我需要来自单个列的数据读取列是否有效?@user576510如果所有列/列内容都具有固定的宽度/长度,您可以将文件光标定位在列的正前方,读取内容,然后向前跳转n字节到下一行/列。但是对于普通的csv文件,我假设列长度可变,然后答案是否定的,因为您不知道数据列从何处开始以及当前行何时结束……请尝试解析。@AleksAndreev我认为这很少见,user576510没有提到他的数据集可以包含多行数据。。。但这也是可以处理的。。。带有列名的第一行告诉您数据集有多少列。当逐行阅读内容时,你可以数一数列,如果数字小于预期,则阅读下一行,依此类推。。。“但我觉得我们有点离题了,不是吗?”迈克尔读了第2.6节
foreach (var e in new ChoCSVReader<Customer>("Test.txt").WithDelimiter("\t").ExternalSort(new AddressCityComparer()))
    Console.WriteLine(e.City);