2012-07-14 119 views
0

我想編寫一個採用CSV文件的腳本,刪除其第一行並創建一個新的輸出csv文件。如何複製CSV文件,但跳過第一行?

這是我的代碼:

use Text::CSV_XS; 
use strict; 
use warnings; 
my $csv = Text::CSV_XS->new({sep_char => ','}); 
my $file = $ARGV[0]; 
open(my $data, '<', $file) or die "Could not open '$file'\n"; 
my $csvout = Text::CSV_XS->new({binary => 1, eol => $/}); 
open my $OUTPUT, '>', "file.csv" or die "Can't able to open file.csv\n"; 
my $tmp = 0; 
while (my $line = <$data>) { 
    # if ($tmp==0) 
    # { 
    # $tmp=1; 
    # next; 
    # } 
    chomp $line; 
    if ($csv->parse($line)) { 
     my @fields = $csv->fields(); 
     $csvout->print($OUTPUT, \@fields); 
    } else { 
     warn "Line could not be parsed: $line\n"; 
    } 
} 

在perl的命令行我寫的:c:\test.pl csv.csv,它不創造file.csv輸出,但是當我雙擊它腳本創建一個空白的CSV文件。我究竟做錯了什麼?

回答

2

Yhm ..你不需要任何模塊來完成這個任務,因爲CSV(逗號分隔值)只是文本文件 - 只是打開文件,並迭代它的行(寫入輸出除特定數字之外的所有行,例如第一)。這樣的任務(跳過第一行)非常簡單,使用命令行而不是專用腳本可能會更好。

快速搜索 - 請參閱此鏈接的例子,大約有perl的輸入/輸出操作

http://learn.perl.org/examples/read_write_file.html

PS許多教程。 Perl腳本(程序)通常不會被「編譯」成二進制文件 - 它們當然是「編譯」的,但是,即時運行 - 這就是爲什麼/ usr/bin/perl被稱爲比「編譯器」更像「解釋器」的原因gcc或g ++。我想你要找的是一些帶有語法高亮和其他開發工具的編輯器 - 你可能會用perl插件來嘗試Eclipse(跨平臺)。

http://www.eclipse.org/downloads/

http://www.epic-ide.org/download.php/

[email protected]:~$ cat blabla.csv | perl -ne 'print $_ if $x++; ' 

跳過第一行(打印出僅當變量遞增後它每一次使用超過零)

+0

你的bash的行可能不會對@ user1526112工作,因爲他不幸似乎沒有被使用unixoid系統。 'perl -ne'print $ _ if $ x ++;'' INFILE。csv'應該可以做到。我不太瞭解「cmd.exe」,但追加'> outfile.csv'可能會將輸出放到您想要的位置。 – amon 2012-07-14 21:58:57

3

你的程序ISN」理想情況下寫入,但我不能說出爲什麼它不起作用,如果你通過命令行上的CSV文件,你h大家介紹。你會得到錯誤Could not open 'csv.csv'Can't able to open file.csv?如果不是,則必須在當前目錄中創建該文件。也許你正在尋找錯誤的地方?

如果您只需要放下第一行,則無需使用模塊來處理CSV數據 - 您可以將其作爲簡單的文本文件處理。

如果在命令行中指定文件(如在c:\test.pl csv.csv中),則可以使用<>運算符顯式打開文件而不必使用該文件進行讀取。

只有在行計數器($.變量)不等於1時,該程序才從輸入文件中讀取行並將其打印到輸出中。

use strict; 
use warnings; 

open my $out, '>', 'file.csv' or die $!; 

while (my $line = <>) { 
    print $out $line unless $. == 1; 
} 
相關問題