Konversi nilai yang dipisahkan tab ke tabel ASCII

8

Apa cara paling efisien untuk mengonversi data yang dipisahkan tab seperti ini:

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

Sesuatu yang dekat dengan ini:

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

Saat ini saya menggunakan Notepad ++ sebagai berikut:

  1. Ubah tab menjadi spasi
  2. Sejajarkan data secara manual
  3. Gunakan mode kolom untuk memasukkan pipa

Langkah kedua adalah yang paling membosankan dan saya lebih suka setidaknya bagian ini otomatis.

Catatan: Saya menggunakan browser saat bekerja dan terkadang saya memiliki editor teks yang terbuka di sampingnya. Solusi yang efisien adalah yang paling sedikit membutuhkan usaha. Saya bisa menggunakan:

  • Notepad ++
  • Editor teks umum dengan dukungan regexp find / replace
  • JavaScript diketik di dalam konsol browser
  • Layanan web online
  • PHP pada baris perintah ( php -a)
Salman A
sumber
4
Anda berada di lingkungan apa? Alat apa yang Anda miliki? Mana dari mereka yang Anda kenal? Mana yang Anda inginkan - atau tidak mau - untuk digunakan? Bagaimana Anda mendefinisikan "efisiensi" untuk keperluan pertanyaan ini? Mungkin ada banyak cara untuk melakukan pekerjaan seperti halnya ada orang yang ingin melakukannya; Anda perlu memberikan informasi tambahan. Lihat Cara Mengajukan Pertanyaan yang Baik.
Jeff Zeitlin
@ JeffZeitlin saya akan memperbarui pertanyaan.
Salman A
Ini awkskrip sederhana .
Barmar
@Barmar Saya tidak menggunakan awk tapi saya yakin orang lain akan merasa berguna.
Salman A
ajukan pertanyaan PCG tentang hal itu - lulz akan terjadi. Tunggu, ini sudah ditanyakan ... codegolf.stackexchange.com/questions/100613/… (perhatikan bahwa TSV-> CSV hanya satu perbedaan char ... {{(⊃⍵)⍪⍉⍪↑¨↓⍉↑1↓⍵}s¨'⎕T'⎕T¨(s←1↓¨⊢⊂⍨⊢=⊃)¯1⌽⍵}tampaknya cukup bagus untuk dikerjakan, eh?)

Jawaban:

9

Bagaimana cara mengonversi nilai yang dipisahkan tab ke tabel ASCII?

Saya menggunakan Text Tables Generator untuk tugas semacam ini.

Saya menempelkan data Anda di halaman itu dan itu membuat tabel berikut:

+------+------+------+------+------------+
| 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 |
+------+------+------+------+------------+

Anda kemudian dapat menyalin output ini (generator telah melakukan sebagian besar kerja keras), tempel ke notepad ++ dan bersihkan sesuai kebutuhan.

DavidPostill
sumber
5

Jika Anda membutuhkan solusi baris perintah, Anda juga dapat menggunakan pandoc dengan filter pandoc-placetable .

Tempatkan meja Anda foo.txtdan jalankan:

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

Yang menghasilkan sebagai berikut 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 |

Untuk membaca dari STDIN, tinggalkan --fileargumen. Untuk mencetak ke STDOUT, tinggalkan -oargumen.

mb21
sumber
3

Gagasan ruslan untuk menggunakan perintah Unix / Linux columnadalah ide yang bagus, tetapi baris perintah yang diberikan dalam jawaban mereka tidak cukup berhasil. Pertama-tama, columntidak mengenali \t(atau \\t) pada baris perintah sebagai tab. Jika sudah bash, Anda bisa melakukannya

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

Kalau tidak, Anda bisa melakukannya

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

Tetapi itu pun tidak menjawab pertanyaan. Anda bisa mendapatkan bilah vertikal dengan melakukan

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

yang menghasilkan output seperti

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

Menambahkan garis putus-putus setelah header secara manual tidak terlalu membosankan.


Jika Anda tidak memiliki akses ke sistem Unix / Linux lengkap, Anda dapat menggunakan Cygwin atau salah satu dari Unix-suka lainnya untuk ini.

G-Man Mengatakan 'Reinstate Monica'
sumber
Anda bahkan tidak mengomentari jawaban saya untuk menunjukkan bahwa itu mungkin tidak berhasil. Saya disesatkan oleh keluaran terminal yang menyelaraskan teks karena tab menjadi 8 karakter secara default (tidak seperti set ts=4pengaturan Vim saya ).
Ruslan