Pobieranie danych z pliku *.csv

Odpowiedz Nowy wątek
2018-08-21 11:38
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());
            }
 
        }
edytowany 2x, ostatnio: PYJTER, 2018-08-21 13:20

Pozostało 580 znaków

2018-08-21 11:43

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/que[...]sv-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

edytowany 2x, ostatnio: fasadin, 2018-08-21 11:45

Pozostało 580 znaków

2018-08-21 13:20
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.

Pozostało 580 znaków

2018-08-22 18:01
niemand
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();
           .........
      }
}
edytowany 1x, ostatnio: Ktos, 2018-08-22 21:59

Pozostało 580 znaków

2018-08-22 21:59
1

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

Pozostało 580 znaków

2018-08-22 23:45
1

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

Pozostało 580 znaków

2018-08-23 09:18
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.

Pozostało 580 znaków

2018-08-23 17:35
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.


"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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