import pliku do bazy danych/eksport pliku z bazy danych

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:

imp1

Dodam jeszcze plik którego użyje abyście mogli sami pokombinować:

baza

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:

imp3

Przeciągamy wszystko na formę i ładnie układamy. Zmieniamy tekst przycisków na „Import” i „Eksport”. U mnie wygląda to tak:

imp4

 

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

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.

    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

                    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”

 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.

imp5

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:

 wartosc = rodzajkodu.ReadLine().Split(ControlChars.Tab)

Dodajemy funkcje która do naszego DatagridView wstawi kolumny (słowo „Field” można zmienić na np: kolumna):

For i = 0 To wartosc.Length() - 1
                Tabela.Columns.Add(New DataColumn("Field" & i))
            Next

Zostaje teraz wypełnienie naszej tabeli informacjami:

            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

Catch ex As Exception
            MsgBox("Error building datatable: " & ex.Message)
            Return New DataTable("Empty")

Zamykamy nasz Reader i zwracamy gotową tabele

   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.

        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:

imp6

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:

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:

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ć ;]

Permalink do tego artykułu: https://visualmonsters.cba.pl/import-pliku-do-bazy-danycheksport-pliku-z-bazy-danych/

2 Komentarze

    • Krzsueik on 11 stycznia 2017 at 18:28
    • Odpowiedz

    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

    1. 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

Dodaj komentarz

Twój adres email nie będzie publikowany.