czytanie csv, wyświetlenie w grid

0

Witam,

nie piszę zbyt wiele w C#, potrzebuję wykonać mały "importer"

mam plik csv rozdzielany ","
to co w nim jest chciałbym zapakować do grida ( potem przy pomocy pewnego API stworzyć dokument ale to potem :) )

przy pomocy streamReader czytam sobie mój plik.

jak teraz zapakować to do grida.

próbowałem przy pomocy hashTable ale nie za bardzo

?

0

Pod adresem http://gyansangrah.com/ArticleContent.aspx?ID=reading_csv_files_in_ado_net znajdziesz kod uzywajacy ole.db. jezeli utworzysz DataSet wczesniej (bez using) wtedy bedziesz mógl przypisac ds.Table[0] do DataSource grida.

0
using (StreamReader sr2 = new StreamReader(plik))
            {
                int r = 0;
                while (!sr2.EndOfStream)
                {
                    string s = sr2.ReadLine();
                    string[] es = s.Split(';');
                    for (int c = 0; c < es.Length; c++)
                    {
                        dataGridView1.Rows[r].Cells[c].Value = es[c];
                    }
                    r++;
                }
            }
0

dzięki wesoldi

otrzymuję komunikat
//Indeks był spoza zakresu. Musi mieć wartość nieujemną i mniejszą niż rozmiar kolekcji.
Nazwa parametru: index//

chciałbym także aby pominąć 1szy wiersz pliku csv w dodawaniu go do grida ale mieć go w pamięci

0

dodałem data_grid.Rows.Add(); i teraz działa.

zastanawiam się nad jedną rzeczą
mój csv ma taką strukturę

id , kod+nazwa, ilość

chciałbym aby w gridzie
id, kod, nazwa, kod+nazwa, ilość

                using (StreamReader stream_reader = new StreamReader(this.path_to_file, Encoding.Default))
                {
                    string csv_first_line = stream_reader.ReadLine();
                    string line;
                    int r = 0;

                    while ((line = stream_reader.ReadLine()) != null)
                    {
                        
                        string[] es = line.Split(',');
                        data_grid.Rows.Add();
                        for (int c = 0; c < es.Length; c++)
                        {
                            
                            data_grid.Rows[r].Cells[c].Value = es[c];
                            
                        }
                        r++;
                    }
                    data_grid.AutoResizeColumns();
                }
 
0

Jak masz ten kod i nazwę czymś rozdzielonym, to rób split tez po tym znaku, oczywiście przed wkładaniem danych do grida. Będziesz miał rozdzielone.
A był błąd indeksu, bo musiałbyś już mieć odpowiednią ilość kolumn przygotowaną wcześniej.

0

skopiowałem funkcję i dostaę komunikat, nie możesz dodać wartości do datagridview bo nie ma kolumn, jest linia z dodaniem wiersza?

0

Możesz użyć czegoś takiego jak poniżej do wczytania csv do DataTable. Potem tylko podłączasz wynikową tabelę do grida jako source.

static DataTable GetDataTableFromCsv(string path, bool isFirstRowHeader)
{
    string header = isFirstRowHeader ? "Yes" : "No";

    string pathOnly = Path.GetDirectoryName(path);
    string fileName = Path.GetFileName(path);

    string sql = @"SELECT * FROM [" + fileName + "]";

    using(OleDbConnection connection = new OleDbConnection(
              @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathOnly + 
              ";Extended Properties=\"Text;HDR=" + header + "\""))
    using(OleDbCommand command = new OleDbCommand(sql, connection))
    using(OleDbDataAdapter adapter = new OleDbDataAdapter(command))
    {
        DataTable dataTable = new DataTable();
        dataTable.Locale = CultureInfo.CurrentCulture;
        adapter.Fill(dataTable);
        return dataTable;
    }
}

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