4 votes

Transformer une largeur fixe en CSV ?

J'ai tout un tas de fichiers de données avec un contenu différent mais une mise en page identique. Je dois les convertir en CSV avant de les importer dans une application CRM.

J'ouvre généralement le fichier délimité par des tabulations dans Excel, qui me demande de définir manuellement les tabulations à l'aide de l'assistant d'importation de texte. Une fois le fichier ouvert, je le convertis en CSV.

Le problème est que j'ai un tas de ces fichiers (disons 20-30) et qu'Excel ne se souvient pas de ce que l'on fait dans l'assistant d'importation de texte et que, pour des raisons trop longues à expliquer ici, je ne peux pas les combiner tous dans un seul fichier de masse - même si la structure des données est identique.

Je me demande s'il existe un programme ou un processus qui me permettrait d'enregistrer un "modèle" de la structure du fichier de données, puis de l'appliquer à chaque fichier afin de ne pas avoir à le recréer manuellement ?

3voto

MaQleod Points 12844

Pour cela, j'utiliserais normalement un traitement par lots dans un langage de script.

Par exemple, voici AutoIt :

$getfile = FileOpenDialog("Choose a file",@ScriptDir, "*.tsv",7)
If StringInSTr($getfile,"|") = 0 Then
    $split = StringSplit($getfile,"|")
    For $i = 2 to $split[0]
        $file = FileOpen($split[$i])
        StringReplace($split[$i],@TAB,",")
        FileClose($split[$i])
    Next
Else
    $file = FileOpen($getfile)
    StringReplace($file,@TAB,",")
    FileClose($file)
EndIf

Cela serait tout aussi facile en VBScript, Batch, Python ou Perl.

0voto

Robert Vabo Points 158

Quels outils avez-vous à votre disposition ? Par exemple, êtes-vous limité à l'interface graphique de Windows, ou avez-vous, disons, un compte Shell de Linux ? Pouvez-vous télécharger des déchets arbitraires, ou êtes-vous limité à ce qui se trouve sur votre poste de travail ?

Si ce n'est pas le cas, que diriez-vous d'ouvrir les fichiers dans Word / wordpad / notepad et de faire une recherche et un remplacement global, en remplaçant les tabulations par des virgules ? Ou peut-être avec "," si votre ensemble de données contient des virgules.

0voto

joshuadfranklin Points 31

J'ai tendance à utiliser Textpad pour ce genre de choses, car je peux effectuer des recherches et des remplacements à l'aide d'expressions régulières, et je remplace les tabulations par des virgules. Peut-être qu'une approche similaire pourrait vous aider dans votre scénario

0voto

RedGrittyBrick Points 78148

Si les colonnes de données sont séparées par un ou plusieurs onglets, chacun d'entre eux est un onglet.

perl -p -i.bak -e "s/\t+/,/g" filenames

donde filenames pourrait être *.tsv par exemple - ou une liste de noms de fichiers.

Si les colonnes de données sont séparées par des caractères d'espacement et que aucun des données réelles comprend des espaces

perl -p -i.bak -e "s/\s+/,/g" filenames

Si les données peuvent contenir des espaces, j'écrirais un script un peu plus complexe utilisant subscript o unpack en fonction d'une liste de positions ou de largeurs de colonnes. Postez un court exemple de lignes de données réelles et du résultat souhaité.

0voto

Brandon Points 2580

Si vous êtes sous Windows et que vous avez PowerShell installé vous pouvez utiliser cette ligne unique pour prendre tous les fichiers .CSV dans le dossier actuel, les importer en tant que fichier "délimité par des tabulations" (`t), et les réexporter en tant que CSV réels avec le même nom, mais préfixé par "New-" :

(get-childitem "*.csv" | foreach ($_) { ($newName="New-"+$_.name) -and (Import-Csv $_.fullname -Delimiter "`t" | Export-Csv .\$newName -notype) }) -and (Remove-Variable "newName")

Pour des raisons de clarté et d'écriture, le voici découpé en plusieurs lignes :

get-childitem "*.csv" | foreach ($_) { 
    $newName="New-"+$_.name
    Import-Csv $_.fullname -Delimiter "`t" | Export-Csv .\$newName -notype
    }
Remove-Variable "newName"

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X