我的問題是雙重的:Perl的拆分與額外的正則表達式組合
場景:我生成一個使用標準的逗號分隔符一個CSV日誌文件。目前CSV文件中有四個「列」,但未來可能會添加更多。我有興趣將REGEX搜索/替換限制爲特定的數據列(例如,COL 2)。
第2列中的數據因響應設備而異。最終,我使用REGEX將條件值「浮動」爲浮點數,保留兩位小數。一些條目帶有各種僞像(例如,額外的字母或其他表示),我使用REGEX轉換爲適當的浮點表示。所有的REGEXs現在都適用於我的目的,但我希望將這些REGEX限制在第二列(COL 2)中的數據中,所以如果我將來添加類似格式的列(例如浮點數),它們不受第2列REGEX的影響。
我認爲這樣做的一種方式是使用拆分並將列數據保存到標量變量中,然後通過包含REGEX的循環或子例程運行COL2標量,然後將條件化的COL2值重新寫回到一個新的CSV文件。 (我目前做這與Perl的$^I變量)。
$^I = ".org";
while (<>) {
my ($col1, $col2, $col3, $col4) = (split /,/);
$col2 =~ s/EXP1/FORMATTED/;
$col2 =~ s/EXP2/FORMATTED/;
$col2 =~ s/EXP3/FORMATTED/;
my $new_rec = join ",", $col1,$col2,$col3,$col4;
print $new_rec;
}
所以問題1:我不知道這是否足夠有效,或者如果我做不必要的工作?我是否可以在REGEX中特別添加逗號,使其僅適用於COL2?
問題2:針對re:split(SPLIT Question)的問題,brian d foy對Text :: CSV_XS說了如下:「速度非常快,這就是爲什麼我說」非常優化「的原因。它也能正確處理CSV,而不是分割。「
如果這是準確的,意思分裂不能正確處理CSV文件,我的上述解決方案將工作一段時間?我不確定他分裂的意思是不能正確處理CSV。
CSV允許逗號成爲數據的一部分,以及分隔符。通常,數據中的逗號位於引號內。 CSV解析器將忽略引號中的逗號,但「split」不會。 – toolic