2014-09-19 21 views
0

我想讀取一個csv文件,並只檢索幾列。 然而,每個像列的數量是相當大的(大約100列)Perl正則表達式:跳過CSV文件的幾列

這裏的問題是我嘗試讀取列的內容1,2,3,4,5,60等 我只想問,如果在正則表達式跳過列6-59,所以我可以讀取列60

這裏是我的嘗試至今1線,分號的方式(;)是分隔符

if ($line =~ /^([^;]+);([^;]+);([^;]+);([^;]+);([^;]+);[[^;]+;]{59};([^;]+)/) { 
    print "$1, $2, $3, $4, $5, $6\n"; 
} 

但代碼不起作用。如果有人能幫我做到這一點,我將不勝感激。

+0

一些示例數據或有關您的數據的信息將有所幫助。像可以引用';''或不... – 2014-09-19 01:27:49

+0

一行可以看起來像這樣{a; b; c; d; e; ...; z; ...},「...」意味着有多個元素。例如:「...」=「f; g; h; i; j」我不需要檢索 – lightbringer 2014-09-19 01:28:28

回答

1

您可以使用核心模塊Text::ParseWords

例如:

#!/usr/bin/perl 
use strict; 
use warnings; 

use Text::ParseWords; 

while (<DATA>) { 
    my @words = parse_line(";", 1, $_); 
    print join(":", @words[ 0, 1, 4 ]), "\n"; 
} 

__DATA__ 
1;2;"3;4;5";6;7 

此輸出:

1:2:7 

你的具體情況,分割線到一個數組後,可以使用@words[0..4]打印四個元素或$words[60]打印第61個元素。

+0

嗨,我使用了split()函數並從中提取不同的列。但是它會比Regexp慢嗎?我只是讓自己熟悉Regular Expression。 – lightbringer 2014-09-19 01:48:47

+1

@lightbringer「split」將比任何基於「正則表達式」的方法快得多。使用該模塊的原因是因爲你在你的評論中說過你可以嵌套';'應該被視爲一個。 'parse_line'方法將幫助您將分隔線分割爲右分隔符。當然,如果你的數據很簡單';'那麼你不需要模塊。 – 2014-09-19 01:50:54

+0

@jaypal:Perl'split'並不是特別快,主要是由於創建了標量。在這種情況下,如果要放棄大部分輸出,則正則表達式實際上可能會更快。 – salva 2014-09-19 09:58:43