J'ai un certain nombre de fichiers CSV volumineux et je les souhaite au format TSV (format séparé par des tabulations). La complication est qu'il y a des virgules dans les champs du fichier CSV, par exemple:
A,,C,"D,E,F","G",I,"K,L,M",Z
Production attendue:
A C D,E,F G I K,L,M Z
(où les espaces entre les deux sont des onglets «durs»)
J'ai Perl, Python et coreutils installés sur ce serveur.
text-processing
python
perl
csv-simple
Cœur sombre
la source
la source
Réponses:
Python
Ajouter au fichier nommé
csv2tab.sh
et le rendre exécutableEssais
la source
csv.writer(sys.stdout, dialect='excel-tab').writerows(csv.reader(sys.stdin))
? Élimine également la boucle.python -c 'import csv,sys; csv.writer(sys.stdout, dialect="excel-tab").writerows(csv.reader(sys.stdin))'
. Je doute-m
que cela fonctionne de cette façon.Pour le plaisir,
sed
.Si votre
sed
ne prend pas en charge-E
, essayez avec-r
. Si votresed
ne prend pas en charge\t
un onglet littéral, essayez de mettre un onglet littéral (dans de nombreux shells, ctrl- v tab) ou dans Bash, utilisez une$'...'
chaîne de style C (auquel cas la barre oblique inversée\2
doit être doublée). Si vous souhaitez conserver les guillemets, utilisez\1
au lieu de\2
(auquel cas la paire de parenthèses internes est inutile et peut être supprimée).Cela n'essaie pas de gérer les guillemets doubles échappés à l'intérieur des guillemets doubles; certains dialectes CSV le supportent en doublant le double guillemet cité (sic).
la source
Utilisation d'un
csvkit
utilitaire (Python), par exemple:Est-ce que le streaming, avec des citations et échappements CSV et TSV corrects
C'est dans apt et autres gestionnaires de paquets
la source
Une option pourrait être le module Text :: CSV de perl, par exemple
démontrer
la source
Perl
Awk
Résultat:
la source
La solution thermonucléaire de tapette à mouches doit utiliser libreoffice. Alors que https://ask.libreoffice.org/en/question/19042/is-is-possible-to-convert-comma-separated-value-csv-to-tab-separated-value-tsv-via-headless-mode / suggère que ce n'est pas possible mais que c'est faux (ou juste obsolète?) et la commande suivante fonctionne sur mon 5.3:
loffice "-env:UserInstallation=file:///tmp/LibO_Conversion" --convert-to csv:"Text - txt - csv (StarCalc)":9,34,UTF8 --headless --outdir some/path --infilter='csv:44,34,UTF8' *.csv
l'
env
argument peut être ignoré mais de cette façon, les documents n'apparaîtront pas dans votre document récent.la source
Si vous avez ou pouvez installer l'
csvtool
utilitaire:Notez que pour une raison quelconque, il
csvtool
n'a pas de page de manuel, maiscsvtool --help
imprimera quelques centaines de lignes de documentation.la source
L'utilisation
mlr
est presque succincte, mais la désactivation des en-têtes nécessite de longues options:Sortie:
la source
J'ai créé un convertisseur CSV vers TSV open source qui gère les transformations décrites. C'est assez rapide, peut valoir le coup d'œil s'il y a un besoin continu de convertir de gros fichiers CSV. L'outil fait partie de la boîte à outils des utilitaires TSV d' eBay (documentation csv2tsv ici ). Les options par défaut suffisent pour l'entrée décrite:
la source
Vim
Juste pour le plaisir, des substitutions d'expression régulière peuvent être effectuées dans Vim . Voici une solution potentielle à quatre lignes, adaptée de: /programming/33332871/remove-all-commas-between-quotes-with-a-vim-regex
Les guillemets sont supprimés.
Pour écrire un peu la solution, les quatre lignes ci-dessus (sans signe deux-points) peuvent être enregistrées dans un fichier, par exemple
to_tsv.vim
. Ouvrez chaque CSV pour le modifier avec Vim etsource
leto_tsv.vim
script sur la ligne de commande Vim (adapté de /programming/3374179/run-vim-script-from-vim-commandline/8806874#8806874 ):la source
Voici l'exemple de conversion de CSV en TSV à l'aide de l'
jq
utilitaire :ou:
Cependant, le format CSV doit être bien formaté, donc chaque chaîne doit être citée.
Source: format de sortie TSV simple .
la source
Avec
perl
, en supposant que les champs csv n'ont pas de"
tabulations ou de nouvelles lignes intégrées ou:la source
Ce qui suit est simplement une correction à la réponse de @tripleee afin qu'il supprime toutes les citations du champ final comme il le fait pour tous les autres champs.
Pour montrer ce qui est corrigé, voici la réponse d' un tripleee , plus une légère modification des données d'exemple de l'OP avec des guillemets ajoutés autour du champ « Z » final .
Vous pouvez voir que « Z » est laissé avec des guillemets autour. Ceci est différent de la façon dont les champs internes sont traités. Par exemple, le « G » n'a pas de guillemets dessus.
La commande suivante utilise une deuxième substitution pour nettoyer la dernière colonne:
la source
'A,,C,"D,E,F","G",I,"K,L,M","Z,A"'
sont entrées dans cette réponse, le"Z,A"
est incorrectement remplacé parZ A
, plutôt que correctZ,A
.