【发布时间】:2012-09-17 21:45:00
【问题描述】:
是否可以根据行读取 csv 文件。就像给出一个行号,它会在 CSV 中检索该特定行。
谢谢
【问题讨论】:
-
当given行号匹配时停止阅读。
-
不确定你的动机是什么 - 如果是性能,请考虑使用一些 DB...CSV 不是 DB,它只是一个大文件...要读取特定的行号,你会需要阅读所有前面的行(尽管您不需要完全解析它们)...
标签: c#
是否可以根据行读取 csv 文件。就像给出一个行号,它会在 CSV 中检索该特定行。
谢谢
【问题讨论】:
标签: c#
如果您只想读取文本文件的一行(如 csv),最简单的方法是使用 File.ReadLines 和 Enumerable.ElementAtOrDefault:
public static String getFileLine(String path, int indexOfLine)
{
return File.ReadLines(path).ElementAtOrDefault(indexOfLine);
}
这样使用:
String line = getFileLine(@"C:\Temp\CsvFile.csv", 99);
返回第 100 行(如果少于 100 行,则返回 null)。
这是另一个返回一系列行的类似方法:
public static IEnumerable<String> getFileLines(String path, IEnumerable<int> lineIndices)
{
return File.ReadLines(path).Where((l, i) => lineIndices.Contains(i));
}
返回前 10 行:
IEnumerable<int> range = Enumerable.Range(0,10);
IEnumerable<String> lines = getFileLines(@"C:\Temp\CsvFile.csv", range);
foreach (String line in lines)
Console.WriteLine(line);
注意File.ReadLines 与StreamReader 类似,它不会一次将整个文件读入内存(如FileReadAllLines),只要有必要。
【讨论】:
Skip 和Take,例如:var lines = File.ReadLines(path).Skip(19).Take(6);(20-25 -> 6 行)。如果文件少于 25 行,它甚至不会引发异常,它只会返回那里的内容,如果少于 20 行,它会返回 Enumerable.Empty<string>。
ToList 创建一个List<string>,否则你会遇到File.ReadLines 的问题,它会在第一次使用时处理底层流(相反到File.ReadAllLines,它返回一个数组)。
请使用System.IO.StreamReader 和System.IO.StreamWriter 将用于读取和写入csv 文件。他们有ReadLine() 和WriteLine() 方法。
【讨论】:
这取决于你的目标,但你可能应该这样做
while((line = readFile.ReadLine()) != null)
{
//Record line
}
然后,一旦你将文件数据读入内存,你就可以考虑按行查询。
顺便说一句,你真的应该考虑用谷歌搜索这个,即使 Bing'ing 它也会给你答案。
【讨论】:
如果你的文件不是很大,你可以这样做:
string line10 = File.ReadAllLines(@"<filename>", Encoding.Default).ElementAt(10);
【讨论】:
不确定您的动机是什么 - 如果是性能,请考虑使用一些 DB...CSV 不是 DB,它只是一个大文件...要读取特定的行号,您需要阅读前面的所有内容行(尽管您不需要完全解析它们)...或将整个文件读入内存File.ReadAllLines - 这将为您提供string[],您可以在任何您想要的行访问...或使用@987654322 @ 为您提供IEnumerable<string>,这可能对大文件更节省内存/性能...
【讨论】: