9 votes

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

Quel est le moyen le 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 de ça :

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 les tabulations en espaces
  2. Aligner les données manuellement
  3. Utilisez le mode colonne pour insérer les tuyaux

La deuxième étape est la plus fastidieuse et je préférerais qu'au moins cette partie soit automatisée.

Remarque : j'utilise un navigateur pour travailler et j'ai parfois un éditeur de texte ouvert en parallèle. La solution efficace est celle qui demande le moins d'efforts. Je peux l'utiliser :

  • Notepad++
  • Éditeur de texte générique avec support de recherche/remplacement par regexp
  • JavaScript tapé dans la console du navigateur
  • Service web en ligne
  • PHP en ligne de commande ( php -a )

10voto

DavidPostill Points 140654

Comment puis-je convertir des valeurs séparées par des tabulations en un tableau ASCII ?

J'utilise Générateur de tableaux 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 le plus gros du travail), la coller dans notepad++ et la nettoyer si nécessaire.

5voto

malc_b Points 91

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

Placez votre table dans foo.txt et exécuter :

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

Ce qui donne les résultats suivants 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, laissez de côté l'élément --file argument. Pour imprimer sur STDOUT, ne tenez pas compte de l'argument -o argument.

3voto

l'idée du ruslan d'utiliser le système Unix/Linux column est une bonne chose, mais la ligne de commande donnée dans leur réponse ne fonctionne pas vraiment. Tout d'abord, column ne reconnaît pas \t (ou \\t ) sur la ligne de commande comme un onglet. Si vous avez bash vous pouvez 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 un résultat 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 manuellement la ligne de tiret après l'en-tête 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 Unix-likes pour cela.

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