我需要解析和分类非常大的CSV文件的数据。请注意文件大约600K行。我不需要将它存储在某个位置或导入到DB。请指导实施此实施的有效方法。感谢您的分享经历。
答案 0 :(得分:1)
我会这样做......
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...
注意FileOptions.SequentialScan
,也可以使用bufferSize
(不确定默认值是4096还是8192)来获得更好的结果...还要预先分配列表大小以防止调整大小列表...
答案 1 :(得分:1)
使用外部排序处理大文件排序的一种方法。有许多CSV库提供开箱即用的功能。
Cinchoo ETL具有CSVReader并具有外部排序功能。您可以将其用于您的目的
一个。定义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; }
}
湾编写比较器类以对列进行排序(例如,按城市排序)
public class AddressCityComparer : IComparer<Customer>
{
public int Compare(Customer x, Customer y)
{
return String.Compare(x.City, y.City);
}
}
℃。最后,使用ChoCSVReader加载CSV文件。将其传递给ExternalSorting方法以对其进行排序
foreach (var e in new ChoCSVReader<Customer>("Test.txt").WithDelimiter("\t").ExternalSort(new AddressCityComparer()))
Console.WriteLine(e.City);
希望这有帮助。