มีโปรแกรมอรรถประโยชน์บรรทัดคำสั่งเพื่อแปลงไฟล์ csv หรือไม่?


16

รับไฟล์แบบนี้

First,Last,Age
Cory,Klein,27
John Jacob,Smith,30

มียูทิลิตีบรรทัดคำสั่งเพื่อย้ายเนื้อหาเพื่อให้ผลลัพธ์เป็นเช่นนั้นหรือไม่

First,Cory,John Jacob
Last,Klein,Smith
Age,27,30

คำตอบ:


6
ruby -rcsv -e 'puts CSV.parse(STDIN).transpose.map &:to_csv' < in.csv > out.csv

เมื่อพิจารณาถึงอายุของคำถามนี้ฉันจะแสดงให้เห็นว่าการเปลี่ยนแปลงของฉันนี้เป็นที่ยอมรับ: a) คำตอบนี้สั้นกว่า Gilles ' python, b) rubyไม่สามารถเคลื่อนย้ายได้น้อยกว่าpythonและ c) สิ่งนี้ยังแสดงวิธีผ่านอินพุต / เอาท์พุต ไฟล์ Bravo @luikore และยินดีต้อนรับสู่ Unix & Linux กรุณาทำรอบ ๆ
Cory Klein

หนึ่งข้อแม้ใน csv ต้องมีการอ้างถึงฟิลด์
yosefrow

@ yosefrow ไม่จำเป็นต้องมีข้อความ ฉันทดสอบคำสั่งก่อนโพสต์คำตอบนี้
luikore

โอเคควรจะพูดว่า "อาจ" แล้ว มันไม่ได้ผลสำหรับฉันจนกว่าฉันจะอ้างถึงทุกสาขา อาจต้องเกี่ยวข้องกับเนื้อหาข้อมูลของฉัน
yosefrow

16

การแยกวิเคราะห์ CSV ไม่สามารถทำได้ง่ายด้วยเครื่องมือ POSIX เท่านั้นเว้นแต่ว่าคุณกำลังใช้ชุดตัวเลือก CSV แบบง่ายที่ไม่มีการอ้างอิง (เพื่อให้เครื่องหมายจุลภาคไม่สามารถปรากฏในฟิลด์) ถึงกระนั้นงานนี้ก็ดูไม่ง่ายนักที่จะใช้ awk หรือเครื่องมือประมวลผลข้อความอื่น คุณสามารถใช้ Perl กับText::CSV, Python กับcsv, R กับread.csv, Ruby กับCSV , ... (ทั้งหมดนี้เป็นส่วนหนึ่งของไลบรารีมาตรฐานของภาษาที่เกี่ยวข้องยกเว้น Perl)

ตัวอย่างเช่นใน Python:

import csv, sys
rows = list(csv.reader(sys.stdin))
writer = csv.writer(sys.stdout)
for col in xrange(0, len(rows[0])):
    writer.writerow([row[col] for row in rows])


3

วิธีอย่างรวดเร็วและสกปรก:

c=1
file=file.txt
num_lines=$(wc -l < "$file")

for ((i=0; i<num_lines; i++)) {
    cut -d, -f$c "$file" | paste -sd ','
    ((c++))
}

/ tmp / l หมายถึงอะไร นอกจากนี้มันจะไม่ง่ายกว่าหรือไม่ที่จะวนซ้ำผ่านคอลัมน์แทนที่จะเป็นเส้นบางสิ่งบางอย่างตามแนวของfor ((i=1; i<=$num_cols; ++i)); do paste -s -d, <(cut -f$i -d, file.txt); done
iruvar

โปรดทราบว่าสิ่งนี้ใช้ได้กับอินพุตของ OP แต่เพียงเพราะข้อมูลของพวกเขามีจำนวนแถวและคอลัมน์เท่ากันซึ่งมักจะไม่ใช่กรณี
tokland

csv มีสเปคเกี่ยวกับการเสนอราคาแบบ dpuble เช่นthis "is" exampleการเข้ารหัสเซลล์"this ""is"" example"ฉันไม่มั่นใจว่าวิธีการแก้ปัญหานี้จะจัดการกับกรณีดังกล่าวได้อย่างถูกต้องหรือไม่
Grzegorz Wierzowiecki

0

ด้วยข้อ จำกัด ที่แนะนำ (ไม่มีการอ้างอิงไม่มีเครื่องหมายจุลภาค) มันง่ายใน awk (เพราะมันจะอยู่ใน perl โดยไม่คำนึงถึงมากกว่าหนึ่งพันบรรทัดในCSV.pm2300 บรรทัดในcsv.rb- หลามมีเพียง 450 บรรทัดในcsv.py )

นี่คือตัวอย่างสำหรับ awk:

#!/usr/bin/awk -f
BEGIN { width=0; }
{
    max = split($0, list, ",");
    # printf "%d:%s\n", NR, $0;
    if (width < max)
        width = max;
    for (n = 1; n <= max; ++n) {
        sub("^[     ]*","",list[n]);
        sub("[  ]*$","",list[n]);
        # printf "\t%d:%s\n", n, list[n];
        if ( columns[n] != "" ) {
            columns[n] = columns[n] ", ";
        }
        columns[n] = columns[n] list[n];
    }
}
END {
    # printf "%d columns\n", width;
    for (n = 1; n <= width; ++n) {
        printf "%s\n", columns[n];
    }
}

โดยวิธีการ: ตัวอย่างที่กำหนดมีพื้นที่พิเศษซึ่ง OP สันนิษฐานว่าจะถูกลบออก; ตัวอย่างอื่น ๆ ไม่ได้ระบุรายละเอียดนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.