Convertir les valeurs séparées par des tabulations en table ASCII


8

Quelle est la façon la plus efficace de convertir des données séparées par des tabulations comme celle-ci:

a   b   c   d   cat
NULL    NULL    NULL    NULL    NULL
NULL    NULL    NULL    d   d
NULL    NULL    c   NULL    c
NULL    NULL    c   d   c; d
NULL    b   NULL    NULL    b
NULL    b   NULL    d   b; d
NULL    b   c   NULL    b; c
NULL    b   c   d   b; c; d
a   NULL    NULL    NULL    a
a   NULL    NULL    d   a; d
a   NULL    c   NULL    a; c
a   NULL    c   d   a; c; d
a   b   NULL    NULL    a; b
a   b   NULL    d   a; b; d
a   b   c   NULL    a; b; c
a   b   c   d   a; b; c; d

Quelque chose de proche:

a    | b    | c    | d    | cat
-----+------+------+------+-----------
NULL | NULL | NULL | NULL | NULL
NULL | NULL | NULL | d    | d
NULL | NULL | c    | NULL | c
NULL | NULL | c    | d    | c; d
NULL | b    | NULL | NULL | b
NULL | b    | NULL | d    | b; d
NULL | b    | c    | NULL | b; c
NULL | b    | c    | d    | b; c; d
a    | NULL | NULL | NULL | a
a    | NULL | NULL | d    | a; d
a    | NULL | c    | NULL | a; c
a    | NULL | c    | d    | a; c; d
a    | b    | NULL | NULL | a; b
a    | b    | NULL | d    | a; b; d
a    | b    | c    | NULL | a; b; c
a    | b    | c    | d    | a; b; c; d

Actuellement, j'utilise Notepad ++ comme suit:

  1. Convertir des tabulations en espaces
  2. Alignez les données manuellement
  3. Utiliser le mode colonne pour insérer les tuyaux

La deuxième étape est la plus fastidieuse et je préfère avoir au moins cette partie automatisée.

Remarque: J'utilise un navigateur lorsque je travaille et parfois j'ai un éditeur de texte ouvert à côté. La solution efficace est celle qui nécessite le moins d'effort. Je peux utiliser:

  • Bloc-notes ++
  • Éditeur de texte générique avec prise en charge de la recherche / remplacement d'expressions rationnelles
  • JavaScript tapé dans la console du navigateur
  • Service Web en ligne
  • PHP en ligne de commande ( php -a)

4
Dans quel environnement êtes-vous? De quels outils disposez-vous? Lesquels connaissez-vous? Lesquelles êtes-vous disposé (ou non) à utiliser? Comment définissez-vous «l'efficacité» aux fins de cette question? Il y a probablement presque autant de façons de faire le travail qu'il y a de gens qui veulent le faire; vous devez fournir des informations supplémentaires. Voir Comment poser une bonne question.
Jeff Zeitlin

@JeffZeitlin Je mettrai à jour la question.
Salman A

C'est un simple awkscript.
Barmar

@Barmar Je n'utilise pas awk mais je suis sûr que quelqu'un d'autre le trouvera utile.
Salman A du

poser une question PCG à ce sujet - lulz s'ensuivra. Attendez, on lui a déjà demandé ... codegolf.stackexchange.com/questions/100613/… (notez que TSV-> CSV n'est qu'une seule différence de caractère ... {{(⊃⍵)⍪⍉⍪↑¨↓⍉↑1↓⍵}s¨'⎕T'⎕T¨(s←1↓¨⊢⊂⍨⊢=⊃)¯1⌽⍵}semble assez agréable pour travailler, hein?)

Réponses:


9

Comment puis-je convertir des valeurs séparées par des tabulations en une table ASCII?

J'utilise Générateur de tables de texte pour ce genre de tâche.

J'ai collé vos données sur cette page et cela a créé le tableau suivant:

+------+------+------+------+------------+
| a    | b    | c    | d    | cat        |
+------+------+------+------+------------+
| NULL | NULL | NULL | NULL | NULL       |
+------+------+------+------+------------+
| NULL | NULL | NULL | d    | d          |
+------+------+------+------+------------+
| NULL | NULL | c    | NULL | c          |
+------+------+------+------+------------+
| NULL | NULL | c    | d    | c; d       |
+------+------+------+------+------------+
| NULL | b    | NULL | NULL | b          |
+------+------+------+------+------------+
| NULL | b    | NULL | d    | b; d       |
+------+------+------+------+------------+
| NULL | b    | c    | NULL | b; c       |
+------+------+------+------+------------+
| NULL | b    | c    | d    | b; c; d    |
+------+------+------+------+------------+
| a    | NULL | NULL | NULL | a          |
+------+------+------+------+------------+
| a    | NULL | NULL | d    | a; d       |
+------+------+------+------+------------+
| a    | NULL | c    | NULL | a; c       |
+------+------+------+------+------------+
| a    | NULL | c    | d    | a; c; d    |
+------+------+------+------+------------+
| a    | b    | NULL | NULL | a; b       |
+------+------+------+------+------------+
| a    | b    | NULL | d    | a; b; d    |
+------+------+------+------+------------+
| a    | b    | c    | NULL | a; b; c    |
+------+------+------+------+------------+
| a    | b    | c    | d    | a; b; c; d |
+------+------+------+------+------------+

Vous pouvez ensuite copier cette sortie (le générateur a fait la plupart du travail), coller dans le bloc-notes ++ et nettoyer le cas échéant.


5

Si vous avez besoin d'une solution en ligne de commande, vous pouvez également utiliser pandoc avec le filtre pandoc-placetable .

Placez votre table foo.txtet exécutez:

pandoc-placetable --file=foo.txt --delimiter="\t" --header | pandoc -f json -t markdown-simple_tables-multiline_tables -o output.md

Ce qui se traduit par ce qui suit output.md:

| a    | b    | c    | d    | cat        |
|------|------|------|------|------------|
| NULL | NULL | NULL | NULL | NULL       |
| NULL | NULL | NULL | d    | d          |
| NULL | NULL | c    | NULL | c          |
| NULL | NULL | c    | d    | c; d       |
| NULL | b    | NULL | NULL | b          |
| NULL | b    | NULL | d    | b; d       |
| NULL | b    | c    | NULL | b; c       |
| NULL | b    | c    | d    | b; c; d    |
| a    | NULL | NULL | NULL | a          |
| a    | NULL | NULL | d    | a; d       |
| a    | NULL | c    | NULL | a; c       |
| a    | NULL | c    | d    | a; c; d    |
| a    | b    | NULL | NULL | a; b       |
| a    | b    | NULL | d    | a; b; d    |
| a    | b    | c    | NULL | a; b; c    |
| a    | b    | c    | d    | a; b; c; d |

Pour lire à partir de STDIN, omettez l' --fileargument. Pour imprimer sur STDOUT, omettez l' -oargument.


3

L'idée de ruslan d'utiliser la columncommande Unix / Linux est bonne, mais la ligne de commande donnée dans leur réponse ne fonctionne pas tout à fait. Tout d'abord, columnne reconnaît pas \t(ou \\t) sur la ligne de commande comme un onglet. Si vous en avez bash, vous pouvez le faire

column -t -s$'\t' foo.txt

Sinon, vous pouvez faire

column -t -s"$(printf '\t')" foo.txt

Mais même cela ne répond pas à la question. Vous pouvez obtenir les barres verticales en faisant

column -t -s$'\t' -o' | ' foo.txt

qui produit une sortie comme

a    | b    | c    | d    | cat
NULL | NULL | NULL | NULL | NULL
NULL | NULL | NULL | d    | d
NULL | NULL | c    | NULL | c
NULL | NULL | c    | d    | c; d
NULL | b    | NULL | NULL | b
NULL | b    | NULL | d    | b; d
NULL | b    | c    | NULL | b; c
NULL | b    | c    | d    | b; c; d
a    | NULL | NULL | NULL | a
a    | NULL | NULL | d    | a; d
a    | NULL | c    | NULL | a; c
a    | NULL | c    | d    | a; c; d
a    | b    | NULL | NULL | a; b
a    | b    | NULL | d    | a; b; d
a    | b    | c    | NULL | a; b; c
a    | b    | c    | d    | a; b; c; d

Ajouter la ligne de tiret après l'en-tête manuellement n'est pas si fastidieux.


Si vous n'avez pas accès à un système Unix / Linux complet, vous pouvez utiliser Cygwin ou l'un des autres likes Unix pour cela.


Vous n'avez même pas commenté ma réponse pour souligner qu'elle pourrait ne pas fonctionner. J'ai été induit en erreur par la sortie du terminal qui alignait le texte car les tabulations étaient de 8 caractères par défaut (contrairement à mon set ts=4paramètre Vim ).
Ruslan
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.