Frage

Ich versuche, eine Registerkarte getrennte Datei in eine Tabelle zu importieren.

Das Problem ist, MANCHMAL, wird die Datei eine peinliche Datensatz enthält, die zwei „Nullwerte“ hat und bewirkt, dass mein Programm ein „unerwartetes Ende der Datei“ zu werfen.

Zum Beispiel wird jeder Datensatz 20 Felder hat. Aber der letzte Datensatz wird nur zwei Felder (zwei Nullwerte) aufweisen, und daher unerwartet EOF.

Zur Zeit verwende ich eine StreamReader.

Ich habe versucht, die Linien zu zählen und bcp, bevor die „Phantom nulls“ Lesen zu stoppen erzählen, aber StreamReader bekommt eine falsche Anzahl der Zeilen auf Grund der „Phantom Nullen“.

Ich habe den folgenden Code versucht, von allen falschen Code loszuwerden (Code das Netz entlehnt aus). Aber es ersetzt nur die Felder mit leeren Räumen (I das Ergebnis keine Linie möchten hinter sich gelassen).

Public Sub RemoveBlankRowsFromCVSFile2(ByVal filepath As String)
    If filepath = DBNull.Value.ToString() Or filepath.Length = 0 Then Throw New ArgumentNullException("filepath")

    If (File.Exists(filepath) = False) Then Throw New FileNotFoundException("Could not find CSV file.", filepath)


    Dim tempFile As String = Path.GetTempFileName()

    Using reader As New StreamReader(filepath)
        Using writer As New StreamWriter(tempFile)
            Dim line As String = Nothing
            line = reader.ReadLine()
            While Not line Is Nothing

                If Not line.Equals(" ") Then writer.WriteLine(line)

                line = reader.ReadLine()
            End While
        End Using
    End Using


    File.Delete(filepath)
    File.Move(tempFile, filepath)
End Sub

Ich habe versucht, mithilfe von SSIS, aber es trifft auf die EOF unerwarteten Fehler.

Was mache ich falsch?

War es hilfreich?

Lösung 5

Dies wurde ein Bit-Array gelöst verwendet wird, um ein Bit zu einem Zeitpunkt für die Verdächtigen Bit zu überprüfen.

Andere Tipps

Wenn Sie die gesamte Datei in ein String-Variable lesen (mit reader.ReadToEnd ()) Haben Sie die ganze Sache bekommen? oder sind Sie immer nur die Daten bis zu jenen Phantom nulls?

Haben Sie versucht, die Reader.ReadBlock () Funktion über die Dateilänge zu versuchen und zu lesen?

In unserem Unternehmen haben wir Hunderte von Importen jede Woche. Wenn eine Datei nicht in den richtigen gesendet wird, für unseren automatisierten Prozess zu formatieren vereinbart, kehren wir zurück an den Absender. Wenn die letzte Zeile falsch ist, sollte die Datei nicht verarbeitet werden, da sie möglicherweise beschädigt Informationen oder auf andere Weise fehlen.

Eine Möglichkeit, den Fehler zu vermeiden, ist ReadAllLines zu verwenden, dann das Array von Dateizeilen verarbeiten, anstatt durch die Datei von voran. Dies ist auch viel effizienter als Stream.

Dim fileLines() As String
fileLines = File.ReadAllLines("c:\tmp.csv")
...
for each line in filelines
  If trim(line) <> "" Then writer.WriteLine(line)
next line

Sie können auch die Datei auf einmal verwenden, um die Ausgangsleitungen in dem gleichen oder einem anderen String-Array speichern und File.WriteAllLines verwenden zu schreiben.

Sie könnten versuchen, den integrierten .NET-Objekt zum Lesen tabstoppgetrennten Dateien. Es ist Microsoft.VisualBasic.FileIO.TextFileParser .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top