Pobieranie danych z pliku *.csv

0

Witam serdecznie mam problem z pobieraniem danych z pliku *.csv rozdzielonych średnikiem ";"

1;20180102;12;123;;124;;PL
2;20180102;11;123;;125;;PL
3;20180102;8;122;;122;;PL

I teraz próbuję okodować sobie button by pobierało mi dane z pliku i następnie wrzucało zawartość do dataGridView. Jednak jakoś nie chce mi to działać znaczy nie rozdziela mi na kolumny tam gdzie jest średnik. Wczytuje wszystkie wiersze ale daje tylko dwie kolumny w których zbite są całe pojedyncze wiersze próbowałem zarówno ustawić Delimited(,) jak i Delimited(;) i nie działa.
Z góry dziękuję za pomoc kod poniżej:

private void button1_Click(object sender, EventArgs e)
        {


            dgvDane.Columns.Clear();

            try
            {
            
              


                MyConnection = new System.Data.OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\\\\servertestpyjter\\test\\;Extended Properties='Text;HDR=YES;FMT=Delimited(,)'");





                    MyCommand = new System.Data.OleDb.OleDbDataAdapter("select * from [test-1.csv]", MyConnection);
                    MyCommand.TableMappings.Add("Table", "TestTable");

                    //Wczytanie wszystkich danych do DtSet

                    DtSet = new System.Data.DataSet();
                    MyCommand.Fill(DtSet);
                    int ile_wierszy = (DtSet.Tables[0].Rows.Count);
                    progressBar1.Maximum = ile_wierszy;
                    int ile_kolumn = (DtSet.Tables[0].Columns.Count);
                MessageBox.Show(ile_kolumn + " " + ile_wierszy + " " + DtSet.Tables[0].Rows[12][0]);


                MyConnection.Close();
                
                dgvDane.DataSource = DtSet;

            }
            catch (Exception ex)
            {
                //Wyświetlenie informacji o ewentualnym wyjątku
                MessageBox.Show(ex.ToString());
            }

        }
2
  1. robisz polaczenie co klik co jest bledem. Polaczenie robi sie jedno
  2. czemu uzywasz System.Data.OleDb.OleDbConnection do parsowania csv?
  3. https://stackoverflow.com/questions/3109360/how-to-specify-the-delimiter-when-importing-csv-files-via-oledb-in-c-sharp

w punkcie 3) masz rozwiązanie

tl:dr
musisz stworzyc plik schema.iniw ktorym bedizesz miec

[file.csv]
Format=Delimited(;)

bo inaczej sie nie da

0

Dzięki 1 poprawiłem co do drugiego nie wiem czemu akurat OleDb.OleDbConnection kiedyś tego użyłem do importu xls i xlsx działało więc postanowiłem to wdrożyć w csv ;)
Potrzebuje każdy wiersz zaciągać osobno zmieniać wartości w locie i następnie do datagridview. Zmodyfikowałem wg Twoich wskazówek i działa idelanie ;) Ale...

Okazało się że miałem użyty w nazwie pliku "-" test-1.csv, test-2.csv i program się wykrzacza po zmianie "-" na "_" działa idelanie.

1

Tak na marginesie, do wczytywania CSV zamiast wymagającego instalacji ACE możesz użyć Microsoft.VisualBasic.FileIO;

string plik = ............;
Encoding enc1= this.enc1250;
using (TextFieldParser tfp = new TextFieldParser(plik, enc1))
{
      tfp.Delimiters = new string[] { "," };
      while (!tfp.EndOfData)
      {
           string[] fields = tfp.ReadFields();
           .........
      }
}
1

Ja z kolei do plików CSV bardzo polecam CsvHelper.

1

Mi tutaj kiedyś ktoś polecił https://www.filehelpers.net

2

A może proste zapytanie linq i nie trzeba żadnych dodatkowych bibliotek?

var query = from csvline in File.ReadAllLines(@"d:\testcsv.scv")
  let data = csvline.Split(';')
  select new
  {
   nr = int.Parse(data[0]),
   D1 = data[1], // tu jakieś rzutowanie na DateTime ?
   D2 = int.Parse(data[2]),
   D3 = int.Parse(data[3]),
   D4 = int.Parse(data[3]),
   D5 = int.Parse(data[3]),
   D6 = int.Parse(data[3]),
   D7 = data[3]
  };

qyuery podpinasz do Grida przez BindingSource albo bezpośrednio.
Lepiej też (jeśli to istotne) stworzyć sobie klasę na te dane i w Select tworzyć obiekty tej kasy zamiast anonimowego.

0

Różnica jest taka, że biblioteki zazwyczaj mają wbudowaną obsługę nagłówków, separatorów, a przede wszystkim błędów. Doklepywanie tego do "prostego zapytania LINQ" zazwyczaj jest grą niewartą świeczki.

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