我知道你要(1)跳過含有什麼,或不符合您的規範線。 (2)如果它們是單元格的唯一內容,則捕獲16個非空格字符。 (3)按照字面模式「user_id =」捕獲16個非空格字符。
如果可以捕獲空格字符,如果它們遵循「user_id=
」字面值,則可以在適當的位置將\S
更改爲.
。
我的解決方案使用Text::CSV處理處理一個CSV文件的詳細信息。這裏是你將如何做到這一點:
use strict;
use warnings;
use autodie;
use open ':encoding(utf8)';
use utf8;
use feature 'unicode_strings';
use Text::CSV;
binmode STDOUT, ':utf8';
my $csv = Text::CSV->new({binary => 1})
or die "Cannot use CSV: " . Text::CSV->error_diag;
while(my $row = $csv->getline(\*DATA)) {
my $column = $row->[0];
if($column =~ m/^(\S{16})$/ || $column =~ m/user_id=(\S{16})/) {
print $1, "\n";
}
}
__DATA__
abcdefghijklmnop
user_id=abcdefghijklmnop
abcd fghij lmnop
randomdatAuser_id=abcdefghijklmnopMorerandomdata
user_id=abcd fghij lmnop
randomdatAuser_id=abcd fghij lmnopMorerandomdata
在自己的代碼,你會不會使用DATA
文件句柄來,但我相信你知道如何已經open文件。
CSV是一種格式,看起來很簡單。不要將其高可讀性與解析簡單性混爲一談。處理CSV時,最好使用經過驗證的模塊來提取列。其他解決方案可能會導致引用嵌入的逗號,逃過的逗號,不平衡的引號以及我們的大腦隨時爲我們修復的其他違規行爲,但這會使純正規解決方案變得脆弱。
+1它是更好的答案,因爲我的..;) – jm666 2012-07-12 19:51:05
@ user1521736就跟進了幾個星期後檢查,看看是否這個應答(或其他的一個)是對您有所幫助。 – DavidO 2012-08-10 22:03:45