Import z pliku txt do datagriedview

0

Mam takie pytanie próbuję zaimportować sobie plik txt do DataGriedView i mam problem cały czas mi się wykłada na wierszu 38 i dostaję komunikat:

Wystąpił nieobsługiwany wyjątek typu „System.IndexOutOfRangeException” w System.Data.dll

Dodatkowe informacje: Nie można odnaleźć kolumny 8

 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 WindowsFormsApplication10
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            System.IO.StreamReader file = new System.IO.StreamReader("C:\\Users\\pkaczmar\\Desktop\\DANE1.txt");
            string[] columnnames = file.ReadLine().Split(' ');
            DataTable dt = new DataTable();

            foreach (string c in columnnames)
            {
                dt.Columns.Add(c);
            }
            string newline;
            while ((newline = file.ReadLine()) != null)
            {
                DataRow dr = dt.NewRow();
                string[] values = newline.Split(' ');
                for (int i = 0; i < values.Length; i++)
                {
                    dr[i] = values[i];
                }
                dt.Rows.Add(dr);
            }
            file.Close();
            dataGridView1.DataSource = dt;
        }
    }
}

Dane z pliku txt mam w formie:
20160101 PL01 000000000000000003 PL02 TO 0000000001 1.720 0000000001 0000000002

Może macie jakieś pomysły jak to zaimportować??

Drugie moje pytanie to jak widać sa to dane oddzielone tabulatorami i załóżmy chciałbym by importowało mi tylko kolumnę 1,4,7,8,9 czy można to już na etapie importu pomijać czy trzeba to najpierw załóżmy wrzucić do tablicy a potem już do bazy zapisywać bez tych kolumn których nie chce??

Z góry dziękuję za pomoc dopiero raczkuję w tym temacie także proszę o wyrozumiałość.

0

jakos nie widze numeracji wierszu.
Czy bedac mna bylbys wstanie wskazac 38 linijke?

Zamiast nagich tablic uzywaj List<string> nie bedziesz miec problemu z wychodzeniem po za zakres tablicy
Kolumny byloby dobrze opisac na poczatku pliku (a najlepiej to zrobic to w formacie JSON). Bo jezeli jakas dana nie bedzie wystepowac w pliku (nie bedzie 0 tylko po prostu nic nie bedzie) to Twoj kod sie wykrzaczy

Co do drugiego pytania mozesz miec rozne strategie importowania. Masz jakis tam Importer do ktorego wrzucasz odpowiednia strategie i go po prostu uruchamiasz i Ci zwraca jedynie potrzebne kolumny.

Tez (latwiejsza ale brzydsza werjsa) mozesz zrobic tak, ze bedziec kilka importerow i kazdy bedzie mial wlasna logike i w zaleznosci od tego co bedziesz chcial uruchomic to uruchamiasz odpowiedni importer

Na sam koniec mozesz to robic juz po zimportowaniu danych, chociaz nie widze tutaj sensu zeby tak robic

0

sprawdzałeś, czy zgadza ci się ilość kolumn dt.Columns to ilością elementów w tablicy values ?

0

moim zdaniem błąd powstaje w tym miejscu

 
dr[i] = values[i];

pryczyną jest to, że values.Length jest większe od columnnames.Length

0

Witam,

Zobacz czy taki model nie będzie lepszy:

private DataTable GetDateTableFromFile(string fileName, char separator, bool containsColumnNames)
{
    var dataTable = new DataTable();

    using (var fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
    {
        using (var streamReader = new StreamReader(fileStream, Encoding.Default))
        {
            while (streamReader.Peek() > -1)
            {
                var line = streamReader.ReadLine();

                if (string.IsNullOrEmpty(line))
                {
                    continue;
                }

                var array = line.Split(separator);

                if (dataTable.Rows.Count == 0)
                {
                    if (containsColumnNames)
                    {
                        foreach (var columnName in array)
                        {
                            dataTable.Columns.Add(columnName, typeof(string));
                        }
                    }
                    else
                    {
                        for (var i = 0; i < array.Length; i++)
                        {
                            dataTable.Columns.Add(string.Format("Column{0}", i + 1), typeof(string));
                        }
                    }

                    continue;
                }

                if (array.Length < dataTable.Columns.Count)
                {
                    continue;
                }

                var row = dataTable.NewRow();

                for (var i = 0; i < dataTable.Columns.Count; i++)
                {
                    row[i] = array[i];
                }

                dataTable.Rows.Add(row);
            }
        }
    }

    return dataTable;
}

Pozdrawiam,

mr-owl

P.S. Kod jest poglądowy więc może zawierać błędy

1 użytkowników online, w tym zalogowanych: 0, gości: 1