web-dev-qa-db-fra.com

convertir un fichier txt en csv séparés par des onglets

Désolé les gens, je suis nouveau sur Linux, et même si j'ai parcouru la liste des questions répondues, je ne sais pas assez pour savoir si ma question a reçu une réponse. Ou si je peux adapter l'une des réponses à mon petit problème particulier.

Je reçois un fichier texte de données de mon patron, qui a appris à utiliser les ordinateurs à sens unique; et il ne changera pas. Les données sont presque un fichier csv, sauf que les champs sont tous séparés par un espace, plutôt qu'une virgule ou un caractère de tabulation. Et les champs de texte des données incluent également les espaces incorporés.

Chaque champ est soit un nombre, soit des chiffres et du texte, tous les champs ont des longueurs variables et aucun n'est décalé avec des guillemets simples ou doubles. Les champs numériques sont prédominants et aucun champ de texte n'est adjacent à un autre champ de texte. Il est rare qu'un numéro incorporé dans un champ de texte soit précédé ou suivi d'un caractère [espace].

Malheureusement, tous les caractères [espace] ne peuvent pas être simplement remplacés. Parce que, généralement, les sauts de champ se présentent sous la forme [space] [0-9] ou [0-9] [space], voici comment déterminer si un caractère [space] doit être converti en [tab] personnage ou pas. Si le caractère [espace] est à côté d'un chiffre, il doit être converti en caractère [tab].

Donc, en utilisant la fonction Rechercher/Remplacer dans le Bloc-notes pour Windows, je recherche une combinaison espace-chiffre ou espace-chiffre, en convertissant ce caractère [espace] en un caractère [tab]. Je dois le faire dix fois [0-9] [espace] puis dix fois plus [espace] [0-9]. Je cherche un script pour le faire automatiquement.

Voici un exemple du fichier que je reçois. Il contient quatre champs séparés par des caractères [espace] (première ligne). Chaque ligne suivante est un enregistrement, la deuxième ligne est donc le premier enregistrement. Account est 2281, Units est 19, Description est Toshiba PX-1982GRSUB {, et enfin le champ Delta contient le 0:

Account Units Description Delta  
2281 19 Toshiba PX-1982GRSUB 0  
9618 200 HP MX19942-228b -25  
19246 4 CompuCom HD300g Hard Drive 4

Je cherche donc un script qui lise le fichier d'origine, convertisse les caractères [espace] séparateurs de champs en caractères et les écrive dans un nouveau fichier. Et je veux l'explication - pour que je ne pose pas les mêmes questions encore et encore.

1
Bobby H.

Une recherche sur le Web pour "remplacer l’espace par une virgule" a été très fructueuse, cela n’a-t-il pas fonctionné en premier? Aurait trouvé beaucoup de réponses comme this :

tr ' ' ',' < input > output

ou pour les onglets:

tr '\t' ',' < input > output

et

sed 's/\s\+/,/g' input > output

\s est la classe d'espace (comme [: space:]) et doit remplacer toutes les exécutions (+ (échappé) = un ou plusieurs caractères précédents) d'espaces, de tabulations ou de nouvelles lignes. Cette prochaine ne remplacerait que chaque espace ou tabulation par une seule virgule (comme si vous utilisiez les deux au-dessus de tr '):

sed 's/[ \t]/,/g' input > output

Et -i édite le fichier à la place (édite directement le fichier) dans sed

Voici un sed qui correspondra à un espace ou à un espace, et les remplacera par une virgule, à l'aide de la commande/symbole OR _ | échappé sous la forme \| ci-dessous:

sed 's/ [0-9]\|[0-9] /,/g'
1
Xen2050

Ok, vous devez donc remplacer les deux premiers et les derniers espaces de chaque ligne par une virgule. Vous ne pouvez pas simplement remplacer tous les espaces, car le troisième champ peut contenir des espaces. Vous pouvez le faire avec le remplacement de l'expression régulière. Voici un script/commande sed qui fonctionne:

sed -re 's/^(\S*) (\S*) (.*) (\S+)\s*$/\1,\2,\3,\4/' in.txt > out.csv

Avec l'exemple ci-dessus, cela retourne:

Account,Units,Description,Delta
2281,19,Toshiba PX-1982GRSUB,0
9618,200,HP MX19942-228b,-25
19246,4,CompuCom HD300g Hard Drive,4

Ceci est encore assez fragile avec la gestion des champs vides et des ruptures complètes, si les colonnes autres que la 3ème contiennent des espaces. Il est très facile d'introduire de telles données malformées si elles sont formatées manuellement, comme le fait votre patron. Vous devriez lui suggérer de passer à un format de tableau plus robuste (par exemple, un fichier CSV & Co. approprié) et un éditeur (les outils de feuille de calcul courants peuvent manipuler le fichier CSV de manière très souple et flexible, par exemple, LibreOffice/OpenOffice Calc, Microsoft Excel et Google Docs).

1
David Foerster