3 votes

Ignorer les sauts de ligne dans la valeur CSV

Donc, j'ai un CSV qui contient un nom de fichier et le contenu d'un fichier. Le fichier est plein de sauts de ligne et de toutes sortes d'autres caractères. J'ai besoin que chaque ligne contienne le nom du fichier dans une colonne et le contenu du fichier dans la colonne suivante, puis j'ai besoin d'une nouvelle ligne, jusqu'à la fin du fichier.

Les données ressemblent à ceci :

"filename.txt","salut là
pote
comment vas-tu
faire"
"filename2.txt","et ainsi de suite..."

Selon http://creativyst.com/Doc/Articles/CSV/CSV01.htm#EmbedBRs, mon importateur CSV devrait lire ces valeurs de sauts de ligne comme des valeurs uniques, pas de nouvelles lignes. Cependant, j'ai essayé OO Calc, KSpread, Gnumeric, et même Microsoft Excel 2007 et aucun d'eux ne le lit de cette façon; ils considèrent tous chaque saut de ligne comme une nouvelle ligne.

Quelqu'un sait comment résoudre ce problème? J'ai regardé d'autres questions similaires mais aucune d'entre elles ne semble le dire.

Si cela ne fonctionne pas, je devrai écrire le fichier directement avec un module d'écriture Excel Python ou quelque chose. Quelqu'un sait quoi faire ici?

0voto

King Julian Points 1626

Spécifiez guillemet (") comme séparateur de texte lors de l'importation. Les sauts de ligne seront alors ignorés.

0voto

Pete855217 Points 788

Si votre fichier .csv a ses champs multi-lignes entre guillemets avec juste chr(10) (0x0A) pour faire le saut de ligne (ce qui semble être la valeur par défaut pour les fichiers .csv exportés par Excel 2007), et non chr(13)+chr(10), alors le traitement standard des fichiers VBA fonctionne parfaitement en utilisant line input #1 et split. Le résultat est que vous obtenez un seul élément de tableau dynamique du champ avec sa nouvelle ligne à l'intérieur.

Exemple pour un fichier csv qui pourrait avoir des sauts de ligne dans le champ 3 (4) :

dim recFields as variant
dim rec as string
open "testfile.csv" for input as #1
line input #1, rec
while not eof(1)
    recFields = split(rec,vbTab)
    recFields(3) = replace(recFields(3),chr(10),"|")
    ' Peut-être vouloir supprimer les guillemets également
    recFields(3) = replace(recFields(3),chr(34),"")
    ' Faites quelque chose ici.
    ' Ensuite, lisez l'enregistrement suivant
    line input #1,rec
wend
close #1

La clé est d'avoir des sauts de ligne représentés simplement par 0x0A dans le champ, et non 0x0C+0x0A, et d'utiliser un tableau dynamique (variant) pour diviser l'enregistrement. Je redoutais de devoir gérer cette situation, jusqu'à ce que je réalise qu'avec le bon vieux VBA, ça fonctionnait simplement. L'alternative redoutée de la lecture en avance, puis en arrière (par exemple en utilisant ftell et fseek de PHP) a été évitée !

0voto

graphi Points 1

Merci Alex P! Cela me permet d'exporter du texte de Scrivener vers Excel d'une bien meilleure manière. Voici ma variation de votre script VBA :

    Sub importScriv()

Dim recFields As Variant
Dim rec, rec2 As String
Dim index, row, col, numcols
Dim FileName

FileName = ThisWorkbook.Path & "/scriv.txt"

Open FileName For Input As #1
Line Input #1, rec
' Obtenir la ligne suivante
Line Input #1, rec2
row = 1

While Not EOF(1)
    ' La compilation de Scrivener doit mettre un caractère % + tabulation comme première chose dans le Préfixe de la Configuration de Section
    ' Le % est utilisé pour délimiter les documents de Scrivener
    Do While Left(rec2, 1) <> "%"
        rec = rec & rec2 & Chr(13)
        ' Obtenir la ligne suivante
        Line Input #1, rec2
        If EOF(1) Then GoTo Finish
    Loop

    ' Diviser les lignes aux séparateurs de tabulation
    recFields = Split(rec, vbTab)
    numcols = UBound(recFields) - LBound(recFields) + 1

    ' Mettre les données dans la ligne
    For col = 1 To numcols
        ' Supprimer tout retour chariot initial
        If Left(recFields(col - 1), 1) = CHR(13) Then
          recFields(col - 1) = Right(recFields(col - 1), Len(recFields(col - 1)) - 1)
        End If
        Cells(row, col) = recFields(col - 1)
    Next col

    ' Nous avons un % dans rec2 donc définir rec à rec2
    rec = rec2

    ' incrémenter la ligne
    row = row + 1
    ' Obtenir la ligne suivante
    Line Input #1, rec2
Wend

Finish: Close #1

' Enfin, supprimer la première colonne qui contient les caractères de séparation de document %
Columns(1).EntireColumn.Delete

End Sub

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X