gpt4 book ai didi

c# - 在 .NET 中处理大型 csv 的最有效方法

转载 作者:太空狗 更新时间:2023-10-29 18:05:28 24 4
gpt4 key购买 nike

请原谅我的笨拙,但我只需要一些指导,我找不到另一个问题来回答这个问题。我有一个相当大的 csv 文件(~300k 行),我需要确定给定的输入,csv 中的任何行是否以该输入开头。我已经按字母顺序对 csv 进行了排序,但我不知道:

1) 如何处理 csv 中的行 - 我应该将其作为列表/集合读入,还是使用 OLEDB、嵌入式数据库或其他东西?

2) 如何从按字母顺序排列的列表中有效地找到某些东西(利用它已排序的事实来加快速度,而不是搜索整个列表)

最佳答案

你没有给出足够的细节来给你一个具体的答案但是......


如果 CSV 文件经常更改,则使用 OLEDB 并根据您的输入更改 SQL 查询。

string sql = @"SELECT * FROM [" + fileName + "] WHERE Column1 LIKE 'blah%'";
using(OleDbConnection connection = new OleDbConnection(
@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fileDirectoryPath +
";Extended Properties=\"Text;HDR=" + hasHeaderRow + "\""))

如果 CSV 文件不经常更改并且您对其运行大量“查询”,则将其一次加载到内存中并每次快速搜索。

如果您希望搜索与列完全匹配,请使用字典,其中键是您要匹配的列,值是行数据。

Dictionary<long, string> Rows = new Dictionar<long, string>();
...
if(Rows.ContainsKey(search)) ...

如果您希望您的搜索像 StartsWith 一样是部分匹配,那么有一个数组包含您的可搜索数据(即:第一列)和另一个列表或数组包含您的行数据。然后使用 C# 的内置二进制搜索 http://msdn.microsoft.com/en-us/library/2cy9f6wb.aspx

string[] SortedSearchables = new string[];
List<string> SortedRows = new List<string>();
...
string result = null;
int foundIdx = Array.BinarySearch<string>(SortedSearchables, searchTerm);
if(foundIdx < 0) {
foundIdx = ~foundIdx;
if(foundIdx < SortedRows.Count && SortedSearchables[foundIdx].StartsWith(searchTerm)) {
result = SortedRows[foundIdx];
}
} else {
result = SortedRows[foundIdx];
}

注意代码是在浏览器窗口内编写的,可能包含语法错误,因为它未经测试。

关于c# - 在 .NET 中处理大型 csv 的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14342560/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com