Dzisiaj pokaże jak wykonać import pliku typu csv, dat albo innego pliku, musimy tylko wiedzieć jak zapisywany jest plik. Aby to sprawdzić otwieramy plik za pomocą notatnika. Ja posłużę się takim pliczkiem z danymi które wyglądają tak:
Dodam jeszcze plik którego użyje abyście mogli sami pokombinować:
plik pierwotnie miał rozszerzenie *.dat ale musiałem ją zmienić na *.csv
Zaczynamy standardowo od utworzenia nowego projektu. Po otworzeniu nowej formy przeciągamy na nią potrzebne nam elementy, te elementy to:
-DataGridView
-2x Button
-TextBox
-OpenFileDialog
Wszystkie te elementy możemy znaleźć w przyborniku. Wyglądają mniej więcej tak:
Przeciągamy wszystko na formę i ładnie układamy. Zmieniamy tekst przycisków na „Import” i „Eksport”. U mnie wygląda to tak:
Textbox posłuży nam do wyświetlenia ścieżki do plik który wybraliśmy .
Zaczynamy do zainicjowania kilku zmiennych, czyli pod „Public class Form1” wpisujemy
1 2 3 |
Public Class Form1 Private FileName as String Private ds as New DataSet() |
Filename as String przechowywać będzie ścieżkę do naszego pliku, ds będzie nowym zbiorem danych. Wracamy do projektanta i dwukrotnie przyciskamy na button1 („import”). Program przechodzi nam samoistnie do kodu. Przycisk ten musi zainicjować nam Filedialog. Czyli opcje wyboru naszego pliku z dysku.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click OpenFileDialog1.Filter = "csv files|;*.csv" OpenFileDialog1.Title = "Select a csv file" OpenFileDialog1.FileName = "" Try With OpenFileDialog1 If .ShowDialog() = DialogResult.OK Then FileName = .FileName TextBox1.Text = FileName Dim myData As DataTable = TworzTabele(FileName) ' inicjacja nowej tabeli i wypełnienie jej funkcją ds.Tables.Add(myData) ' wypełnienie bazy danych informacjami z tabeli DataGridView1.DataSource = myData ' wyświetlenie tabeli w DatagridView End If End With Catch End Try End Sub |
Sprawdzamy czy działa. Jeśli się udało pojawi nam się okno wyboru pliku. Pierwsze trzy linijki kodu odpowiadają za wygląd i wypełnienie naszego FileDialogu. OpenFileDialog1.Filter służy do filtrowania plików, czyli pokażą nam się tylko pliki z rozszerzeniem które zawarliśmy w cudzysłowie. Title będzie umieszczony na naszej formie. Filename wpisuje nazwe w textboxie w OpenFileDialog. Następnie tworzymy standardową pętle otwierającą nasz OpenFileDialog. Dodatkową rzeczą jest tu tylko
1 |
TextBox1.Text = FileName |
który wyświetli ścieżkę do pliku w textboxie. Nie musimy inicjować „FileName” ponieważ zrobiliśmy to na początku programu. Można sprawdzić czy działa. Teraz stworzymy funkcje ktora załaduje nam nasz plik do DataGridView i przeniesie jej elementy do „ds” zainicjowanego na początku programu.
Nazwiemy sobie taką funkcje „tworztabele”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
Private Function TworzTabele(ByVal SciezkaDoPliku As String) As DataTable Dim Tabela As DataTable = New DataTable("MyTable") Dim i As Integer Dim wiersze As DataRow Dim wartosc As String() Dim f As IO.File = Nothing Dim rodzajkodu As New IO.StreamReader(SciezkaDoPliku, System.Text.Encoding.UTF8) Try wartosc = rodzajkodu.ReadLine().Split(ControlChars.Tab) For i = 0 To wartosc.Length() - 1 Tabela.Columns.Add(New DataColumn("Field" & i)) Next wiersze = Tabela.NewRow For i = 0 To wartosc.Length() - 1 wiersze.Item(i) = wartosc(i).ToString Next Tabela.Rows.Add(wiersze) While rodzajkodu.Peek() <> -1 wartosc = rodzajkodu.ReadLine().Split(ControlChars.Tab) wiersze = Tabela.NewRow For i = 0 To wartosc.Length() - 1 wiersze.Item(i) = wartosc(i).ToString Next Tabela.Rows.Add(wiersze) End While Catch ex As Exception MsgBox("Error building datatable: " & ex.Message) Return New DataTable("Empty") Finally rodzajkodu.Close() End Try Return Tabela End Function |
Dobra może to trochę zawiłe ale opisze co i jak co robi więc może będzie łatwiej. Najpierw musimy zainicjować nasze zmienne.
Ważne jest aby zorientować się w rodzaju kodowania naszych plików. zazwyczaj jest to UTF8, ale różny język i kultura (np, chiński) może mieć inny sposób kodowania. Więc warto otworzyć sobie jakiegoś excela i spróbować zaimportować do niego w różnych systemach, aż nasz plik będzie wyglądał normalnie. Ja do tego użyłem LibrOffica, tak to w nim wygląda.
Warto też rozpracować co zostało użyte jako rozdzielone informacje, w tym wypadku Tabulator i średnik. Dzielimy teraz informacje na kolumny kodem Split(ControlChars.Tab) określa nam separator czyli w tym wypadku tabulator:
1 |
wartosc = rodzajkodu.ReadLine().Split(ControlChars.Tab) |
Dodajemy funkcje która do naszego DatagridView wstawi kolumny (słowo „Field” można zmienić na np: kolumna):
1 2 3 |
For i = 0 To wartosc.Length() - 1 Tabela.Columns.Add(New DataColumn("Field" & i)) Next |
Zostaje teraz wypełnienie naszej tabeli informacjami:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
wiersze = Tabela.NewRow ' dodaje nowy wiersz For i = 0 To wartosc.Length() - 1 wiersze.Item(i) = wartosc(i).ToString ' dodaje informacje do komurek Next Tabela.Rows.Add(wiersze) ' wypełnia tabele While rodzajkodu.Peek() <> -1 wartosc = rodzajkodu.ReadLine().Split(ControlChars.Tab) wiersze = Tabela.NewRow For i = 0 To wartosc.Length() - 1 wiersze.Item(i) = wartosc(i).ToString Next Tabela.Rows.Add(wiersze) End While |
Na koniec zostaje nam tylko wyłapanie błędów i ewentualne wyświetlenie informacji, że nasz plik jest pusty. Służy do tego formuła
1 2 3 |
Catch ex As Exception MsgBox("Error building datatable: " & ex.Message) Return New DataTable("Empty") |
Zamykamy nasz Reader i zwracamy gotową tabele
1 2 3 4 5 |
Finally rodzajkodu.Close() End Try Return Tabela End Function |
Teraz odwołujemy się do naszej funkcji:
Inicjujemy nową tabele i wypełniamy ją naszą funkcją. Następnie podłączamy naszą tabele i wypełnioną bazę danych do DataGridView1.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
OpenFileDialog1.Filter = "csv files|;*.csv;*.dat;" OpenFileDialog1.Title = "Select a csv, dat file" OpenFileDialog1.FileName = "" Try With OpenFileDialog1 If .ShowDialog() = DialogResult.OK Then FileName = .FileName Dim myData As DataTable = TworzTabele(FileName) ' inicjacja nowej tabeli i wypełnienie jej funkcją ds.Tables.Add(myData) ' wypełnienie bazy danych informacjami z tabeli DataGridView1.DataSource = myData ' wyświetlenie tabeli w DatagridView End If End With Catch End Try |
Odpalamy i podziwiamy jak to wygląda, u mnie wygląda to ładnie:
Możemy już importować plik, teraz możemy naszą bazę danych zmieniać do woli, kasować i dodawać nowe wiersze. Musimy teraz naszemu przyciskowi „eksportuj” dać jakieś właściwości aby można było ten zmieniony plik gdzieś wykorzystać. Piszemy drugą funkcje, nazwiemy ją data_to_txt. Wygląda ona tak:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Private Sub data_to_txt(ByVal dt As DataTable, ByVal filename As String) Dim sw As New IO.StreamWriter(filename, False) If dt.Columns.Count < 0 OrElse dt.Rows.Count < 0 Then 'Pętla na wypadek przedwczesnego przyciśnięcia eksportu MsgBox("Nie zostało nic zaimportowane") Exit Sub End If For row As Integer = 0 To dt.Rows.Count - 1 For col As Integer = 0 To dt.Columns.Count - 1 sw.Write(dt.Rows(row).Item(col).ToString & ControlChars.Tab) Next sw.Write(Environment.NewLine) Next sw.Close() End Sub |
Przyciskamy w projektancie dwukrotnie na nasz przycisk „eksport” i przenosi nas do kodu. Kod który da nam możliwość zapisu to:
1 2 3 4 5 6 7 8 9 10 |
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click Dim sfd As New SaveFileDialog With sfd .FileName = "nowa" .Filter = "Text File|*.csv" End With If sfd.ShowDialog = Windows.Forms.DialogResult.OK Then Call data_to_txt(ds.Tables("MyTable"), sfd.FileName) End If End Sub |
To tyle jeśli chodzi o cały kod można go pobrać stąd: kod
Cały projekt : Import Eksport plikow
Z plikami takimi można zrobić masę rzeczy ja na przykład wykorzystuje ten rodzaj programu do oddzielenia interesujących mnie informacji i usunięcia zbędnych a następnie zapisania go z takim samym rozszerzeniem. Można także stworzyć bazę danych i wypełniać ją takimi informacjami. Baza która przedstawiłem w tym tutorialu jest bazą nie zapisywalną. Jeśli będzie taka potrzeba (ktoś będzie chciał taki tutorial) to mogę go napisać ;]
2 Komentarze
Wszytko fajnie ale gdzie ja mam to dodac bo nie mam pojecia ?
Private Function TworzTabele(ByVal SciezkaDoPliku As String) As DataTable
Dim Tabela As DataTable = New DataTable(„MyTable”)
Dim i As Integer
Dim wiersze As DataRow
Dim wartosc As String()
Dim f As IO.File = Nothing
Dim rodzajkodu As New IO.StreamReader(SciezkaDoPliku, System.Text.Encoding.UTF8)
Try
wartosc = rodzajkodu.ReadLine().Split(ControlChars.Tab)
For i = 0 To wartosc.Length() – 1
Tabela.Columns.Add(New DataColumn(„Field” & i))
Next
wiersze = Tabela.NewRow
For i = 0 To wartosc.Length() – 1
wiersze.Item(i) = wartosc(i).ToString
Next
Tabela.Rows.Add(wiersze)
While rodzajkodu.Peek() -1
wartosc = rodzajkodu.ReadLine().Split(ControlChars.Tab)
wiersze = Tabela.NewRow
For i = 0 To wartosc.Length() – 1
wiersze.Item(i) = wartosc(i).ToString
Next
Tabela.Rows.Add(wiersze)
End While
Catch ex As Exception
MsgBox(„Error building datatable: ” & ex.Message)
Return New DataTable(„Empty”)
Finally
rodzajkodu.Close()
End Try
Return Tabela
End Function
Author
Ma Pan rację, nie zawarłem tego w tutorialu, chociaż w elementach do pobrania (kod i projekt) znajduje się odpowiedź. Oczywiście „Private Function TworzTabele(ByVal SciezkaDoPliku As String) As DataTable” należy wstawić w metodzie Button1_Click