čeština v CSV souboru   zodpovězená otázka

VB.NET

Zdravím, prosím (opět) o radu:) Pomocí kódu níže načítám do dataTable CSV soubor. Vše se načte OK až na české znaky. Přitom když soubor otevřu ručně například v excelu, české znaky jsou zobrazeny korektně. Četl jsem zde i diskuzi kde zazněla rada otevřít soubor a uložit s jiným kódováním. To ale bohužel není v mém případě možné. Jde tedy něják načíst data aby se české znaky zobrazili korektně?

Nyní data načítám takto:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Sub loadCSV(ByVal CSVFile As String)
    Dim dtCSV As DataTable = New DataTable 'vytvořím novou dataTable
 
    dtCSV.Columns.Add()
 
 
    Dim stream As IO.Stream = IO.File.OpenRead(CSVFile)
    Dim soubor As IO.StreamReader = New IO.StreamReader(CSVFile, System.Text.Encoding.UTF8, False)
 
 
 
 
    While Not soubor.EndOfStream
        Dim text As String = soubor.ReadLine()
        dtCSV.Rows.Add()
        dtCSV.Rows(dtCSV.Rows.Count - 1).Item(0) = text
    End While
 
    soubor.Close() 'zavřu soubor
 
 
    frmOnImport.DataGridView1.DataSource = dtCSV 'zobrazím výsledek
End Sub

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pro načtení CSV souboru použijte OLE DB/ODBC poskytovatele pro textové soubory. Jednak to bude daleko výkonější a hodí se to už jen tím, že pro uchování dat používáte databázové struktury. To kódování by se tím mělo vyřešit automaticky.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

To jsem právě zkoušel, jenže u oledDB mi to házi chybu: Nelze najít instalovatelnou metodu ISAM

a u ODBC pro změnu Obecná chyba Nelze otevřít klíč registru

O té chybě u oleDB jsem něco našel na stránkách Microsoftu, řešení ale vyžaduje zásah do registru což není u mě přípustné.

Pro ukázku přikládám kód, kterým se pokouším načíst data přes ODBC:

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
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Me.OpenFileDialog1.ShowDialog()
    Dim path As String = Me.OpenFileDialog1.FileName
 
 
    Dim dtCSV As DataTable = New DataTable
    Dim dbAdapter As Odbc.OdbcDataAdapter = New Odbc.OdbcDataAdapter
    Dim dotaz As Odbc.OdbcCommand = New Odbc.OdbcCommand
 
    Dim spojeni As Odbc.OdbcConnection = New Odbc.OdbcConnection("Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=" & path & ";Extensions=asc,csv,tab,txt;")
 
 
    With dotaz
        .Connection = spojeni
        .CommandType = CommandType.Text
        .CommandText = "SELECT * FROM " & Me.OpenFileDialog1.SafeFileName
    End With
 
 
    dbAdapter.SelectCommand = dotaz
    dbAdapter.Fill(dtCSV)
 
    Me.DataGridView1.DataSource = dtCSV
 
 
End Sub

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Mě se to na CSV souboru (exportovaném z Adresáře Windows do C:\Dokumenty\Contacts.csv) podařilo rozjet v pohodě:

1
2
3
4
5
6
7
8
9
10
11
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
  Dim contacts As New DataTable
  Using adapter As New OdbcDataAdapter
    Using connection As New OdbcConnection("Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=C:\Dokumenty;Extensions=csv")
      Using command As New OdbcCommand("SELECT * FROM Contacts.csv", connection)
        adapter.SelectCommand = command
        Dim n = adapter.Fill(contacts)
      End Using
    End Using
  End Using
End Sub

Vaše chyba bude asi následující: V ConnectionStringu máte v parametru Dbq cestu k souboru místo složky kde se soubor nachází a v parametru SELECT máte úplnou cestu k souboru místo pouze názvu souboru (zaznamenal jsem problémy s dlouhými názvy souborů).

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Do selectu jsem dosazoval pouze fileName ale connectionString byl opravdu špatně. Upravil jsem kód tak aby se tam dosazovala pouze cesta k souboru a už to je ok včetně češtiny.

Přikládám fungující řešení:

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
Sub loadCSV()
     Me.OpenFileDialog1.ShowDialog()
 
     Dim path As String = System.IO.Path.GetDirectoryName(Me.OpenFileDialog1.FileName)
     Dim file As String = Me.OpenFileDialog1.SafeFileName
 
     Dim dtCSV As DataTable = New DataTable
     Dim dbAdapter As Odbc.OdbcDataAdapter = New Odbc.OdbcDataAdapter
     Dim dotaz As Odbc.OdbcCommand = New Odbc.OdbcCommand
     Dim spojeni As Odbc.OdbcConnection = New Odbc.OdbcConnection("Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=" & path & ";Extensions=asc,csv,tab,txt;")
 
 
     With dotaz
         .Connection = spojeni
         .CommandType = CommandType.Text
         .CommandText = "SELECT * FROM " & file
     End With
 
 
     dbAdapter.SelectCommand = dotaz
     dbAdapter.Fill(dtCSV)
 
     Me.DataGridView1.DataSource = dtCSV
 
 End Sub

Díky za radu, takovéhle drobné chyby jsou nejhorší:)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jestli se data čtou v Excelu normálně, pak nemají kódování UTF8

Změňte UTF8 na Default

1
Dim soubor As IO.StreamReader = New IO.StreamReader(CSVFile, System.Text.Encoding.Default, False)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback