2012-06-15 2 views
1

Je voudrais connaître un moyen (bien sûr, je veux savoir le meilleur moyen) pour éditer un fichier CSV, de préférence sans avoir à lire l'original et écrire les résultats à un nouveau.VB.Net éditer un fichier CSV (ou un fichier délimité)

Exemple 1: Je veux diviser le contenu d'une colonne en deux colonnes 123abc en 123, abc

Exemple 2: Je veux retirer des lettres du début d'une colonne AB123 dans 123

Précision : Je n'ai pas besoin d'aide pour résoudre mes exemples; J'ai juste besoin d'être pointé dans la bonne direction de lecture et d'édition du même fichier.

Voici un exemple de code à l'aide d'un fichier temporaire qui me semble trop lent

Dim currentLine as string() 
tempFile.AutoFlush = True 

Do Until origFile.EndOfData 
    currentLine = origFile.ReadFields 
    currentLine(1) = currentLine(1).Replace("ABC","") 'would convert ABC123 to 123 
    For index as Integer = 0 to currentLine.Count - 2 
     tempFile.Write(currentLine(index) & ",") 
    Next 
     tempFile.Write(currentLine(currentLine.Count - 1)) 
     tempFile.WriteLine() 
Loop 

tempFile.Flush() 
tempFile.Dispose() 
origFile.Dispose() 
IO.File.Copy(tempFile,OrigFile,True) 
IO.File.Delete(tempFile) 

Répondre

4

Vous serez vraiment mieux loti écrire un nouveau fichier. Vous pouvez écrire dans un fichier temporaire, supprimer l'ancien fichier et renommer le nouveau fichier en tant que fichier ancien.

Quelque chose comme:

Imports System.IO 

Module Module1 

    Sub Main() 
     Dim tempfile = Path.GetTempFileName() 
     Dim inputFile = "C:\Temp\input.txt" 

     Using sw = New StreamWriter(tempfile) 
      Using MyReader As New Microsoft.VisualBasic.FileIO.TextFieldParser(inputFile) 
       MyReader.TextFieldType = Microsoft.VisualBasic.FileIO.FieldType.Delimited 
       MyReader.Delimiters = New String() {","} 
       Dim currentRow As String() 
       While Not MyReader.EndOfData 
        Try 
         currentRow = MyReader.ReadFields() 
         If currentRow.Count >= 2 Then 
          currentRow(1) = currentRow(1).Replace("ABC", "") 
         End If 
         sw.WriteLine(String.Join(",", currentRow)) 
        Catch ex As Microsoft.VisualBasic.FileIO.MalformedLineException 
         MsgBox("Line " & ex.Message & " is invalid. Skipping") 
        End Try 
       End While 
      End Using 
     End Using 

     File.Delete(inputFile) 
     File.Move(tempfile, inputFile) 

    End Sub 

End Module 

(copie Fondamentalement l'exemple TextFieldParser de http://msdn.microsoft.com/en-us/library/microsoft.visualbasic.fileio.textfieldparser.readfields.aspx)

+1

Alternativement, il pouvait lire l'ancien fichier dans la mémoire, la modifier, puis écrire de nouveau vers le même fichier – briddums

+0

L'utilisation d'un fichier temporaire intermédiaire présente l'avantage que si quelque chose ne va pas, vous ne perdez pas les données. En outre, si le fichier est trop volumineux pour tenir dans la mémoire, il peut être lu ligne par ligne pour le traitement. –

+0

Merci. L'utilisation d'un fichier temporaire semble trop lente. Exemple de code: Dim CurrentLine sous forme de chaîne() tempFile.AutoFlush = True Do Until origFile.EndOfData \t CurrentLine = origFile.ReadFields \t CurrentLine (1) = CurrentLine (1) .Replacer ("ABC", "") « convertirait ABC123 à 123 \t pour l'index en entier = 0 à currentLine.Count - 2 \t \t tempFile.Write (CurrentLine (index) et "") \t Suivant \t \t tempFile.Write (CurrentLine (CurrentLine. Nombre - 1)) \t \t tempFile.WriteLine() boucle tempFile.Flush() tempFile.Dispose() origFile.Dispose() IO.File.Copy (tempFile, origfile, True) IO.File.Delete (tempFile) ' – donbyte

0

Vous pouvez utiliser ADO pour se connecter au fichier CSV. Voir ici pour plus d'informations:

How to read a CSV file into a .NET Datatable

Cependant, je recommande de charger simplement dans un tableau, puis l'écrire en arrière avec des méthodes simples de fichiers IO. Il est juste beaucoup moins de code et les frais généraux:

For Each row As String In File.ReadAllLines("C:\test.csv") 
    For Each column As String In row.Split(New String() {","}, StringSplitOptions.None) 
     ' Do work 
    Next 
Next 

Et puis quelque chose comme ceci pour enregistrer le fichier:

File.WriteAllLines(rows) 
Questions connexes