忽略csv中的行中的逗号

本文关键字:忽略 csv | 更新日期: 2023-09-27 18:07:33

这就是我的问题。

我正在读取CSV到datagridview。CSV的第一行是列标题,文件的末尾成为行。我正在读取文件,并使用作为datagridview的数据源。但是CSV中的一些行有类似于

的内容

名称,测试,1,2,3,测试,2 , 3、2、1,测试名称

当我使用.Split()时,它将其视为行中的新单元格,但列数为10而不是11,我得到以下错误:

输入数组的长度大于该表的列数

我怎样才能避开这个问题呢?

下面是我的c#代码。

OpenFileDialog openFile = new OpenFileDialog();
        openFile.InitialDirectory = "c:''";
        openFile.Filter = "txt files (*.txt)|*.txt| CSV Files (*.csv) | *.csv| All Files (*.*) | *.*";
        openFile.FilterIndex = 2;
        openFile.RestoreDirectory = true;
        try {
            if (openFile.ShowDialog() == DialogResult.OK)
            {
                string file = openFile.FileName;
                StreamReader sr = new StreamReader(file);
                /* gets all the lines of the csv */
                string[] str = File.ReadAllLines(file);
                /* creates a data table*/
                DataTable dt = new DataTable();
                /* gets the column headers from the first line*/
                string[] temp = str[0].Split(',');
                /* creates columns of the gridview base on what is stored in the temp array */
                foreach (string t in temp)
                {
                    dt.Columns.Add(t, typeof(string));
                }
                /* retrieves the rows after the first row and adds it to the datatable */
                for (int i = 1; i < str.Length; i++)
                {
                    string[] t = str[i].Split(',');
                    dt.Rows.Add(t);
                }
                /* assigns the data grid view a data source based on what is stored in dt  */
                dataGridView1.DataSource = dt;
            }
        }
        catch (Exception ex) 
        {
                MessageBox.Show("Error: The CSV you selected could not be loaded" + ex.Message);
        }

忽略csv中的行中的逗号

这听起来更像是数据问题,而不是编程问题。如果你的CSV文件应该有10列,但有些有11列,你怎么知道哪一列是多余的?

您可以做的一件事是在添加行之前检查列的数量。

for (int i = 1; i < str.Length; i++)
{
    string[] t = str[i].Split(',');
    if(t.Length == temp.Length)
        dt.Rows.Add(t);
}