2017-09-19 2 views
0

Ich öffne ein paar CSV-Dateien und lese sie als DataTable nach dem Beispiel, das ich gefunden here. Das Problem, in das ich die grundlegende Abfrage, die ich verwende, um die Daten zu importieren, bin, konvertiert die Spalte von IP-Adressen in Double. Ich möchte also in 10.0.0.1 lesen und es erscheint als 10.001. Wie kann ich diese Spalte als String einlesen? Ich möchte die Datei nicht doppelt verarbeiten, wenn ich kann.Öffnen einer CSV-Datei als eine OLEDB-Verbindung konvertiert Dateitext in doppelte

Abfrage Ich verwende ist einfach und lautet wie folgt:

SELECT * FROM [ComputerList.csv] 

Hier ist meine Funktion ist die CSV-Datei in eine Datentabelle

Public Function OpenFile(ByVal strFolderPath as String, ByVal strQuery as String) as DataTable 
    Dim strConn as String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFolderPath & ";Extended Propteries=""text; HDR=Yes;FMT=Delimited""" 
    Dim conn as OleDb.OleDbConnection = New OleDb.OleDbConnection(strConn) 

    Try 
     conn.Open() 
     Dim cmd as OleDb.OleDbCommand = New OleDb.OleDbCommand(strQuery, conn) 
     Dim da as OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter() 

     da.SelectCommand = cmd 
     Dim ds as DataSet = New DataSet() 
     da.Fill(ds) 
     da.Dispose() 

     return ds.Tables(0) 
    Catch 
     return Nothing 
    Finally 
     conn.Close() 
    End Try 

End Function 
+0

wo ist Ihr Code. das Problem ist offensichtlich nicht in dieser Zeile :) –

+0

Sie könnten sich die [TextFieldParser] (https://docs.microsoft.com/en-us/dotnet/api/microsoft.visualbasic.fileio.textfieldparser?view= netframework-4.7) – peterG

+0

@MutedDisk Ich habe den Code – Talguy

Antwort

0

ok Ich habe versucht, Variationen von jeder hat vorgeschlagen und haben sich auf einen Hybrid zwischen allen von ihnen nieder. Mein Ziel war es, in einer CSV-Datei zu lesen, sie in einem DataTable-Formular zu manipulieren und sie schreiben es wieder aus. Einige meiner CSV-Dateien hatten mehrere Zeilen in einer Zelle und einige hatten Begrenzer innerhalb einer Zelle. Im Folgenden finden Sie meine Hybridlösung, die TextFieldParser zum Einlesen der Datei und zum Aufteilen verwendet hat.

Public Function OpenFile(ByVal File as String, NyVal delim as String) as DataTable 
    Dim dt as New DataTable() 
    Dim firstline as Boolean = True 
    Using MyReader as New Microsoft.VisualBasic.FileIO.TextFieldParser(File) 
     MyReader.TextFieldType = FileIO.FieldType.Delimited 
     MyReader.SetDelimiters(delim) 
     Dim currentRow as String() 

     While Not MyReader.EndOfData 
     Try 
      currentRow = MyReader.ReadFields() 

      If firstline 
       firstline = false 
       For Each col in currentRow 
        dt.Columns.Add(New DataColumn(col.ToString(), System.Type.GetType("System.String"))) 
       Next 
      Else 
       dt.Rows.Add(currentRow.ToArray()) 
      End If 
     Catch ex as Microsoft.VisualBasic.FileIO.MalformedLineException 
      Console.WriteLIne("Line " + ex.Message + " is not valid and will be skipped") 
     End Try 
     End While 
    End Using 

    return dt 
End Function 
1

i dies zu öffnen und lesen verwenden csv ist zu lesen und erzwinge alle zur Zeichenfolge.

Public Function convert_csv_to_data_table(ByVal File As String, ByVal separator As String) As DataTable 
    Dim dt As New DataTable 
    Dim firstLine As Boolean = True 
    If IO.File.Exists(File) Then 
     Using sr As New StreamReader(File) 
      While Not sr.EndOfStream 
       If firstLine Then 
        firstLine = False 
        Dim cols = sr.ReadLine.Split(separator) 
        For Each col In cols 
         dt.Columns.Add(New DataColumn(col, GetType(String))) 
        Next 
       Else 
        Dim data() As String = sr.ReadLine.Split(separator) 
        dt.Rows.Add(data.ToArray) 
       End If 
      End While 
     End Using 
    End If 
    Return dt 
End Function 

EDIT: - dies wird nur btw mit einem Separator arbeiten

+0

Ich versuchte dies, während es besser funktionierte als die meisten anderen Lösungen, die es auf CSV-Dateien, die mehrere Zeilen innerhalb der Zelle enthalten, verschluckt und hatte auch Begrenzer darin. Ich habe Teile davon in meiner Lösung – Talguy

+0

froh, dass es Sie immer noch in die richtige Richtung wies. –

Verwandte Themen