我有一个包含以下数据的 20,000 行 CSV 文件:
位置, | 光, | 邻近, | 斧头, | 哎呀, | AZ, | Gx, | 吉伊, | 广州 |
---|---|---|---|---|---|---|---|---|
侧袋 | 2.0 | 0.0 | -1.1259307861328125 | -10.622817993164063 | 0.8393707275390625 | 0.7456817626953125 | -2.3446502685546875 | -0.6551361083984375 |
手提包 | 2.0 | 0.0 | -1.1259307861328125 | -10.622817993164063 | 0.8393707275390625 | 0.8383636474609375 | -3.1872711181640625 | -0.064971923828125 |
侧袋 | 2.0 | 0.0 | 0.5566253662109375 | -9.675201416015625 | 1.7905426025390625 | 0.8383636474609375 | -3.1872711181640625 | -0.064971923828125 |
侧袋 | 2.0 | 0.0 | 0.5566253662109375 | -9.675201416015625 | 1.7905426025390625 | 0.170440673828125 | -2.976348876953125 | 0.05218505859375 |
后袋 | 2.0 | 0.0 | -0.3665771484375 | -9.739242553710938 | 2.12567138671875 | 0.170440673828125 | -2.976348876953125 | 0.05218505859375 |
侧袋 | 2.0 | 0.0 | -0.3665771484375 | -9.739242553710938 | 2.12567138671875 | -0.1981201171875 | -1.846099853515625 | 0.290802001953125 |
耳朵 | 2.0 | 0.0 | -0.490264892578125 | -9.91455078125 | 1.34954833984375 | -0.1981201171875 | -1.846099853515625 | 0.290802001953125 |
我想要根据列标题循环遍历列的所有行并进行一些计算。我尝试使用 CsvHelper 库:
private void btnBrowse_Click(object sender, RoutedEventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
if (openFileDialog.ShowDialog() == true)
textReader = File.ReadAllText(openFileDialog.FileName);
stringParse = new StringReader(textReader);
txtOutput.Text = "";
}
private void btnParse_Click(object sender, RoutedEventArgs e)
{
var csv = new CsvReader(stringParse);
while( csv.Read() )
{
var stringField = csv.GetField<string>( "Location" );
txtOutput.Text += DoSomething(stringField.ToString()) + "\n";
}
}
我面临的问题是:
我哪里做错了?
以下是实际 CSV 文件的外观:
Location, Light, Proximity, Ax, Ay, Az, Gx, Gy, Gz
"SidePocket" 2.0 0.0 -1.1259307861328125 -10.622817993164063 0.8393707275390625 0.7456817626953125 -2.3446502685546875 -0.6551361083984375
"HandBag" 2.0 0.0 -1.1259307861328125 -10.622817993164063 0.8393707275390625 0.8383636474609375 -3.1872711181640625 -0.064971923828125
"SidePocket" 2.0 0.0 0.5566253662109375 -9.675201416015625 1.7905426025390625 0.8383636474609375 -3.1872711181640625 -0.064971923828125
我可以在 2 秒内读取 20,000 行大小 4 倍的 csv 文件。我不知道
DoSomething
发生了什么,所以这可能是你的下一个调查电话。
我做了以下更改来解决您描述的两个问题。
首先:使用
StringBuilder
来防止在循环中创建和丢弃大量字符串。
第二:将 CsvHelper 的
Delimiter
对象中的 Configuration
设置为空格,但在这种情况下请包含标头字段名称的逗号:
var sw = new Stopwatch();
sw.Start();
using(var csv = new CsvReader(new StreamReader(@"csv-test.txt")))
{
csv.Configuration.Delimiter=" "; // space
var sb = new StringBuilder();
while (csv.Read())
{
var stringField = csv.GetField<string>("Location,"); // the comma is relevant
// or use sb.AppendFormat("{0}\n", DoSomething(stringField));
sb.AppendLine(stringField);
}
txtOutput.Text = sb.ToString();
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
上面的 102,000 行代码在我的机器上运行只需 1.7 秒。