แปลงไฟล์. xlsx (MS Excel) เป็น. csv บนบรรทัดคำสั่งด้วยฟิลด์ที่คั่นด้วยเครื่องหมายอัฒภาค


31

ฉันรู้ว่านี่ไม่ใช่คำถามที่เกี่ยวข้องกับ unix / linux ทั้งหมด แต่เนื่องจากนี่คือสิ่งที่ฉันจะทำบน linux ฉันหวังว่าบางคนจะมีคำตอบ

ฉันมีไฟล์ excel ออนไลน์ ( .xlsx) ซึ่งได้รับการปรับปรุงเป็นระยะ (โดยคนอื่น) ฉันต้องการเขียนสคริปต์และวางเป็น cronjob เพื่อประมวลผล excel แผ่นงาน แต่การทำเช่นนั้นฉันต้องแปลงมันเป็นไฟล์ข้อความ (ดังนั้นก.csv) ด้วยคอลัมน์คั่นด้วยเครื่องหมายอัฒภาค ไม่สามารถคั่นด้วยเครื่องหมายจุลภาคได้เนื่องจากมีบางคอลัมน์อยู่ในเครื่องหมายจุลภาค เป็นไปได้ไหมที่จะทำการแปลงนี้จากเชลล์? ฉันติดตั้ง Open office แล้วและฉันสามารถทำได้โดยใช้ GUI แต่ต้องการทราบว่าเป็นไปได้ไหมที่จะทำสิ่งนี้จากบรรทัดคำสั่ง ขอบคุณ!

PS: ฉันมีเครื่อง Mac เช่นกันดังนั้นหากวิธีแก้ปัญหาบางอย่างสามารถทำงานได้ที่นั่นก็ดีเช่นกัน :)

คำตอบ:


21

OpenOffice มาพร้อมกับโปรแกรมunoconvเพื่อทำการแปลงรูปแบบในบรรทัดคำสั่ง

unoconv -f csv filename.xlsx

สำหรับความต้องการที่ซับซ้อนมากขึ้นคุณสามารถแยกไฟล์ XLSX ด้วยSpreadsheet::XLSXใน Perl หรือopenpyxlPython ตัวอย่างเช่นต่อไปนี้เป็นสคริปต์ quickie เพื่อพิมพ์แผ่นงานเป็นไฟล์ CSV ที่คั่นด้วยเครื่องหมายอัฒภาค (คำเตือน: ไม่ได้ทดสอบ, พิมพ์โดยตรงในเบราว์เซอร์):

perl -MSpreadsheet::XLSX -e '
    $\ = "\n"; $, = ";";
    my $workbook = Spreadsheet::XLSX->new()->parse($ARGV[0]);
    my $worksheet = ($workbook->worksheets())[0];
    my ($row_min, $row_max) = $worksheet->row_range();
    my ($col_min, $col_max) = $worksheet->col_range();
    for my $row ($row_min..$row_max) {
        print map {$worksheet->get_cell($row,$_)->value()} ($col_min..$col_max);
    }
' filename.xlsx >filename.csv

unoconv ไม่ได้มาพร้อมกับ OO ของฉัน แต่ฉันติดตั้งและใช้งานได้ดี (แปลงเป็นไฟล์ที่คั่นด้วยเครื่องหมายจุลภาคไม่ใช่เครื่องหมายอัฒภาค)! ขอบคุณ! ฉันยังคงต้องคิดหาวิธีที่จะได้รับสาขาของฉันที่มีเครื่องหมายจุลภาค แต่ขอบคุณมาก
allrite

@ allrite โอ้ฉันพลาดความต้องการอัฒภาคเป็นตัวคั่น ข้อเสนอแนะของฉันที่จะทำการประมวลผลใน Python หรือ Perl ยังคงยืน แต่ฉันได้เพิ่มสคริปต์ (ยังไม่ทดลอง) เพื่อแปลงเป็น CSV โดยใช้;เป็นตัวคั่น
Gilles 'SO- หยุดความชั่วร้าย'

ขอบคุณ! ฉันใช้สเปรดชีต :: XLSX แต่ใช้รหัสในลิงก์ CPAN ที่คุณระบุ มันใช้งานได้ :)
allrite

1
ผู้ใช้ที่ไม่ระบุชื่อมีปัญหากับเรื่องนี้
Michael Mrozek

9

https://github.com/dilshod/xlsx2csv

ทำงานได้ดีสำหรับฉัน แปลงไฟล์ XLSX ขนาด 85 MB ที่ประมาณ 3 นาทีสำหรับ Mac Book Pro SSD


1
ทำงานได้ดีใน OSX $ python xlsx2csv.py -d ";" my.xlsx my.csvทำงานได้ดีและความสามารถในการกำหนดผู้กระทำผิดขอขอบคุณ +!
hhh

6

ฉันใช้ของ Perl xls2csvการแปลงไฟล์ไปยังxlscsv

ถ้าไม่แน่ใจก็ใช้ได้xlsxเหมือนกัน

เกี่ยวกับ:

ไม่สามารถคั่นด้วยเครื่องหมายจุลภาคได้เนื่องจากมีบางคอลัมน์อยู่ในเครื่องหมายจุลภาค

นั่นเป็นเหตุผลที่มีการนำเสนอข้อความ:

1,2,"data,data, more data"

ขอบคุณสำหรับเคล็ดลับฉันจะลองดู ฉันยังคงต้องการแยกเครื่องหมายอัฒภาคเนื่องจากหลังจากการแปลง csv ไฟล์จะผ่านawkสคริปต์ awkและเพียงเพื่อให้สามารถผ่านอัฒภาคเป็นตัวแยกข้อมูลใน ฉันจะมองหาเครื่องหมายจุลภาคภายในคำพูดเพื่อแทนที่พวกเขากับสิ่งอื่น ... ตอนนี้นั่นคือคำถามอื่น :)
allrite

ขอบคุณ @ neurino ฉันใช้วิธี Gilles แทน แต่ขอบคุณสำหรับการตอบกลับ
allrite

1

ฉันใช้ PHP เพียงติดตั้งไลบรารี PHPExel จากhttp://phpexcel.codeplex.com/ และคุณอาจต้องการฟังก์ชัน XML ด้วย

นี่คือรหัสของฉัน:

<?php

error_reporting(E_ALL);
date_default_timezone_set('Europe/London');

/** PHPExcel_IOFactory */

require_once '/home/markov/Downloads/1.7.6/Classes/PHPExcel/IOFactory.php';

$file="RIF394305.xlsx"; //PATH TO CSV FILE

// Check prerequisites

if (!file_exists($file)) {
    exit("Please run 06largescale.php first.\n");
}

$objReader = PHPExcel_IOFactory::createReader('Excel2003XML');

$objPHPExcel = $objReader->load($file);

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'CSV');

$objWriter->save(str_replace('.xlsx', '.csv',$file));
?>

คุณสามารถย้อนกลับกระบวนการหรือใช้รูปแบบ Excel / CSV ที่แตกต่างกัน ดูไฟล์ php ต่างๆในไดเรกทอรี PHPExcel

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