Member 13932388 Ответов: 2

System.indexoutofrangeexception: "индекс находился за пределами массива".


получение ошибки: System.IndexOutOfRangeException: "индекс находился за пределами массива". в строке : dr[headerWord] = dataWords[columnIndex++];

помощь


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

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

        private void BtnParseDisplay_Click(object sender, EventArgs e)
        {
            openFileDialog1.ShowDialog();

            txtFilePath.Text = openFileDialog1.FileName;
            BindDataCSV(txtFilePath.Text);
        }

        private void BindDataCSV(string filePath)
        {
            DataTable dt = new DataTable();
            string[] lines = System.IO.File.ReadAllLines(filePath);
            if (lines.Length > 0)
            {
                //first line to create header

                string firstLine = lines[0];

                string[] headerLabels = firstLine.Split(',');

                foreach(string headerWord in headerLabels)
                {
                    dt.Columns.Add(new DataColumn(headerWord));
                }

                //for data

            for(int r = 1; r < lines.Length; r++)
                {
                    string[] dataWords = lines[r].Split(',');
                    DataRow dr = dt.NewRow();
                    int columnIndex = 0;
                    foreach (string headerWord in headerLabels)
                    {

                        dr[headerWord] =  dataWords[columnIndex++];
                    }

                    dt.Rows.Add(dr);

                    }
            }

            if (dt.Rows.Count > 0)
            {
                dgvEmployees.DataSource = dt;
            }
        }
    }
}


Что я уже пробовал:

все, что я могу придумать. Я гуглю уже неделю, и мой учитель ничем не может мне помочь.

2 Ответов

Рейтинг:
2

F-ES Sitecore

индекс находился за пределами массива - поиск Google[^]

dataWords[columnIndex++]


columnIndex, вероятно, слишком велик для количества элементов в dataWords. Если dataWords содержит 3 элемента

dataWords[0] = ..
dataWords[1] = ..
dataWords[2] = ..

а если columnIndex больше или равен 3, то вы получите эту ошибку, так как dataWords[3] недействителен.

Вы предполагаете, что строка, которую Вы читаете, имеет необходимое количество столбцов, и очевидно, что это не так. Вам нужно проверить, достаточно ли велик массив, прежде чем пытаться получить доступ к его элементам, и решить, что вы хотите делать, когда это не так.


Рейтинг:
2

Jochen Arndt

Проверьте свой CSV-файл. У ошибки может быть несколько причин.

Одна из них заключается в том, что в строке меньше столбцов (запятых), чем в заголовке. Чтобы обнаружить это сравните количество элементов с количеством элементов заголовка:

if (dataWords.Length != headerLabels.Length)
{
    // Report error here and stop populating this row
}

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

Для обработки таких полей в кавычках необходимо использовать более сложный метод получения полей из строки CSV. Поищите в сети что-нибудь вроде "c# split csv row".

Распространенным решением является использование регулярного выражения типа @"""?\s*,\s*""?" и замените после этого каждые две последовательные двойные кавычки на одну.