Входной массив длиннее, чем количество столбцов в этой таблице. исключение

Я использую следующий код для чтения содержимого файла CSV.

http://www.sendspace.com/file/l0zki3 ссылка для загрузки файла CSV.

Это файл CSV, который находится на моем диске C:\.

Исключение, которое я получаю: "Массив ввода длиннее, чем количество столбцов в этой таблице". Почему это может случиться?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO; //stremreader.. is frm.. System.IO.. .. 


namespace csvtodatagridview
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void ShowData()
        {
            Boolean flg=true;
            string deli = ",";
            string tbname = "Booktb"; //dataset .. used 2 stored. then move dataset to .. grid..
            string filename = ("C:\\SharedIncidents.csv"); // path. plz keep the same path. .. 
            string str = Convert.ToString(System.DateTime.Now);

            DataSet ds = new DataSet();
            StreamReader sr = new StreamReader(filename); //Inputoutput .function 2 read.. file..

            ds.Tables.Add(tbname); //add 2 table.. 

            ds.Tables[tbname].Columns.Add("Date"); //specify. colum1 for datagrid1.
            ds.Tables[tbname].Columns.Add("Status" );//specify colum2 for datagrid2.
            ds.Tables[tbname].Columns.Add("Assignee" );
            ds.Tables[tbname].Columns.Add("Response" );


            string alldata = sr.ReadToEnd();

            string[] rows = alldata.Split("\n".ToCharArray());

            foreach (string r in rows)
            {
                string[] items = r.Split(deli.ToCharArray());
                ds.Tables[tbname].Rows.Add(items); 

            }

            int count = ds.Tables[tbname].Rows.Count;
            int index = 0;
            int currentindex = 0;

            for (index = 0; index < count; index++)
            {
                if (ds.Tables[tbname].Rows[index][0].Equals(str))
                {
                    flg = true;
                    DataSet ds1 = new DataSet();
                    ds1.Tables.Add(tbname);
                    ds1.Tables[tbname].Columns.Add("Date"); //specify. colum1 for datagrid1.
                    ds1.Tables[tbname].Columns.Add("Status");//specify colum2 for datagrid2.
                    ds1.Tables[tbname].Columns.Add("Assignee");
                    ds1.Tables[tbname].Columns.Add("Response");
                    currentindex = index;
                    while (currentindex < count)
                    {
                        DataRow row = ds.Tables["tbname"].Rows[currentindex];
                        ds1.Tables[tbname].Rows.Add(row);
                        currentindex++;
                    }
                    break;
                }
            }

            if (flg == false)
                Console.WriteLine("Date not matched");
            else
                this.dataGridView1.DataSource = ds.Tables[0].DefaultView;


        }

        private void button1_Click(object sender, EventArgs e)
        {
            ShowData(); // call the abv function. . 
        }

    }
}

3 ответа

Трудно ответить, не видя входные данные (или, по крайней мере, образец их). Однако неверно полагать, что "запятая" в CSV означает "следующее поле"; данные могут быть указаны, например:

123, "Gravell, Marc", 1324

Я бы порекомендовал отсюда CSV Reader, который правильно понял.

Ваше "CSV-расщепление" разделяется только на запятые, игнорируя такие вещи, как кавычки. Ты тоже

Например, вот строка из вашего файла:

,frgv,gthbgtb,"be bm,k,"

В настоящее время это будет разделено на:

1. (empty string)
2. frgv
3. gthbgtb
4. "be bm
5. k
6 "

Это больше строк, чем вы хотите. Последние три должны иметь одно значение с запятыми. Вам нужно будет сделать шаг разбора умнее, шагая по строке и помня, находится ли он в указанном регионе. (Или используйте стороннюю библиотеку, как предложил Марк.)

Похоже, что ваша строка содержит дополнительный разделитель, который заставляет его разбить его на дополнительный столбец. Можете ли вы опубликовать образец файла, чтобы проверить это.

РЕДАКТИРОВАТЬ: Да, после просмотра вашего файла я вижу несколько дополнительных запятых в поле ответа, которые будут вызывать их разделение. Поэтому либо рассмотрите возможность использования другого символа для разделения, либо выполните объединение всех элементов в массиве после столбца ответа и вручную добавьте свои элементы в таблицу.

Другие вопросы по тегам