【问题标题】:Reading CSV line-by-line into multiple text boxes in C# [closed]将CSV逐行读取到C#中的多个文本框中[关闭]
【发布时间】:2015-10-23 15:02:44
【问题描述】:

我希望将 CSV 读取到表单中的多个文本框中。 CSV 文件的每一行都有不同的列数,我需要它分别读取 CSV 的每一行 - 我不希望将行末尾的空白值写入文本框。 CSV 如下所示:

M,7,2,2,0,0,0,0,0,0,0,0,1,0,300,0.07
f,,0,f,0,395,1,f,t,f,,,,,,
DATA/BMP99_15.BIN,,,,,,,,,,,,,,,
,5,,0,,0,0,0,0,0,0,0,0,0,,
12,1,1,ATM,,,,,,,,,,,,
0.0315,0,180,0,0,0,0,0,,,,,,,,
1,2,181,0,,,,,,,,,,,,
47.5,352,0,0,12,180,0,0,,,,,,,,
250,2215,15,30,T,N,W,1,A,A,,,,,,

它所要做的就是单击按钮,读取逗号分隔值的每一行并将每个值按顺序放入文本框中。即 textbox1 = CSV 值 1,textbox2 = CSV 值 2,依此类推。

表单看起来像this,每一行对应 CSV 中的一行。

这是我目前拥有的,我从未使用过文本字段解析器,所以这只是一个测试,看看我是否真的可以让它写一个文本框。

    private void buttonreadcsv_Click(object sender, EventArgs e)
    {
        TextFieldParser parser = new TextFieldParser(@"C:\Filepath\inputtest1.csv");
        parser.SetDelimiters(",");
        while (!parser.EndOfData)
        {
            string[] fields = parser.ReadFields();
            tbmodel.Text = fields[0];
        }

谢谢!

【问题讨论】:

标签: c# csv textbox textfieldparser


【解决方案1】:

使用简单的File 读取和string.Split,您可以读取 csv 文件,并获取每行的所有字段。要忽略空条目,请使用StringSplitOptions.RemoveEmptyEntries

编辑
添加了一个解决方法帮助方法RemoveEmptyEntriesAtEnd,它删除了字符串数组末尾的空字符串(null、empty、white-space)!

var rows = File.ReadAllLines("C:\YourDirectory\data.csv"); //get all rows/lines
foreach(var row in rows)
{
    //string[] fields = RemoveEmptyEntriesAtEnd(row.Split(new char[] {','}, StringSplitOptions.RemoveEmptyEntries));
    string[] fields = RemoveEmptyEntriesAtEnd(row.Split(','));
    tbmodel.Text = fields[0]; //and other models.....
    tbmodelN.Text = fields.Length > N ? fields[N] : string.Empty; //when using N-th index of field
}

//The helper method
public static string[] RemoveEmptyEntriesAtEnd(string[] strArray)
{
    var arrRev = strArray.Reverse();
    var emptyEntriesAtEnd = 0;
    foreach (var item in arrRev)
    {
        if (string.IsNullOrWhiteSpace(item))
            emptyEntriesAtEnd++;
        else
            break;
    }
    return arrRev.Skip(emptyEntriesAtEnd).Reverse().ToArray();
}

【讨论】:

  • 我担心RemoveEmptyEntries 会导致空白值发生变化,就像他的样本数据第 4 行中的值一样
  • @Hambone 真的!我已经用解决方法更新了答案。
  • 我在尝试填写其他文本框时收到此错误:“System.IndexOutOfRangeException”。例如,我有 tb1.Text = fields[0]; tb2.Text = 字段[1]; tb3.Text = 字段[2]。这是填写每个文本框的正确方法吗?
  • 因为我们在最后删除空条目,结果数组的大小会减小,因此会出现异常。请参阅有关如何安全使用索引的更新。 tbmodelN.Text = fields.Length > N ? fields[N] : string.Empty;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-09
  • 1970-01-01
相关资源
最近更新 更多