2010-04-29 12 views
1

J'ai ce code pour lire un fichier CVS. Il lit chaque ligne, divise chaque ligne par le délimiteur ',' et stocke les valeurs des champs dans le tableau 'strline()'.Lire uniquement des champs particuliers du fichier CSV dans vb.net

Comment extraire uniquement les champs obligatoires du fichier CSV?

Par exemple, si j'ai un fichier CSV comme

type, groupe, Non, Non Séquence, Row Non, Date (saut de ligne) 0, Admin, 3,345678,1,26052010 (saut de ligne) 1 , Personnel, 5,78654,3,26052010

I N'a besoin que de la valeur des colonnes Groupe, Numéro de séquence et date.

Merci d'avance pour vos idées.

Dim myStream As StreamReader = Nothing 
    ' Hold the Parsed Data 
    Dim strlines() As String 
    Dim strline() As String 
    Try 
     myStream = File.OpenText(OpenFile.FileName) 
     If (myStream IsNot Nothing) Then 
     ' Hold the amount of lines already read in a 'counter-variable' 
     Dim placeholder As Integer = 0 
     strlines = myStream.ReadToEnd().Split(Environment.NewLine) 
     Do While strlines.Length <> -1 ' Is -1 when no data exists on the next line of the CSV file 
      strline = strlines(placeholder).Split(",") 
      placeholder += 1 
     Loop 
     End If 
    Catch ex As Exception 
     LogErrorException(ex) 

    Finally 

     If (myStream IsNot Nothing) Then 
     myStream.Close() 
     End If 
    End Try 

Répondre

7

1) NE PAS UTILISER String.Split !!

Les données CSV peuvent contenir des virgules, par ex.

id,name 
1,foo 
2,"hans, bar" 

également comme ci-dessus, vous devrez gérer les champs cités etc ... Voir CSV Info pour plus de détails.

2) Découvrez TextFieldParser - il a tout ce genre de chose.

Il se chargera de la myriade de différentes évasions vous ne pouvez pas faire avec string.split ...

Extrait de: http://msdn.microsoft.com/en-us/library/cakac7e6.aspx

Using MyReader As New Microsoft.VisualBasic.FileIO.TextFieldParser("C:\TestFolder\test.txt") 
    MyReader.TextFieldType = FileIO.FieldType.Delimited 
    MyReader.SetDelimiters(",") 
    Dim currentRow As String() 
    While Not MyReader.EndOfData 
     Try 
      currentRow = MyReader.ReadFields() 
      Dim currentField As String 
      For Each currentField In currentRow 
      MsgBox(currentField) 
      Next 
     Catch ex As Microsoft.VisualBasic.FileIO.MalformedLineException 
      MsgBox("Line " & ex.Message & "is not valid and will be skipped.") 
     End Try 
    End While 
End Using 

La partie MyReader.ReadFields() vous obtiendrez un tableau de chaînes, de là, vous aurez besoin d'utiliser l'index etc ...

PK :-)

+1

+1 string.split n'est pas seulement faux, c'est aussi très lent par rapport à une machine d'état –

+1

+1 pour avoir crié un avertissement important à l'OP. –

+0

Je suis d'accord que c'est un bon avertissement sur String.Split et "etc en général, mais tout dépend de l'origine des données et de la spécification.La plupart du temps j'ai lu des fichiers CSV et utilisé String. Split, si j'avais fini avec trop de colonnes j'avais échoué le fichier et dit au producteur du fichier de corriger ses données –

0

Peut-être au lieu de ne peut importer que des champs sélectionnés, vous devez tout importer, n'utilisez que ceux dont vous avez besoin.