2016-05-02 8 views
-3

削除する列と追加する場所を知っているPerlスクリプトを作成しています。私はdeleteColumnという配列を持っていますが、これには数字の列が削除されています。同様に私はAddColumnという配列を持っていて、何かを挿入する必要のある場所に関する情報を含んでいます。Perlスクリプトを使用してインプレースで列を追加および削除してファイルを変更します。

入力には、列がカンマで区切られた行があります(,)。これの例は次のようになります。

1,2,3,5,9,7,8,12

今配列deleteColumnの値は、私が delete要素9および12と配列AddColumn関数の値に持っていることを意味している[4,7]と言っている、[3を言っています5] これらのaddColumnは空の追加を示します。つまり、','です。だから、削除 と加えた後、最終的出力は次のようになります。

1,2,3,,5,,7,8.

私はGBの
ファイル(合計サイズ)の周りを読んで、それを操作する必要があるとして、どのように私はこのインラインを達成することができます。これはインラインでできますか?

私はファイルを1行ずつ読みます。

+0

このように書き直す必要がある大きなファイルがあるので、削除して列を挿入しますか?それはあなたがする必要がある唯一の処理ですか? "_inline_"はどういう意味ですか? – zdim

+0

1,2,3,5,9,7,8,12から4番目と7番目の列(ゼロインデックス)を削除すると、1,2,3,5,7,8が残ります。各削除後にインデックスを再計算する必要があります。 3回目と5回目のカラムの前に空のフィールドを追加すると、それぞれの変更後に再びインデックスを計算する必要がないと仮定して、 '1,2,3、、5,7、、8'が返されます。なぜあなたの期待される出力は '1,2,3、、5、、7,8'ですか? – ThisSuitIsBlackNot

+0

問題がないと、すべての挿入と削除を同時に行うのではなく、同時に実行したいように見えます。それはあなたのポストでそれを明確にするのに役立つかもしれません。 – ThisSuitIsBlackNot

答えて

2

列を削除すると、追加する列のインデックスが変更されることがあります。したがって、インデックスを最初に正規化します。降順で数値順にソートし、追加する各インデックスを、削除するカラムの数だけ減らします。

#!/usr/bin/perl 
use warnings; 
use strict; 
use feature qw{ say }; 

my @delete = (4, 7); 
my @add = (3, 5); 

# Normalize the arrays. 
@delete = sort { $b <=> $a } @delete; 
@add = sort { $b <=> $a } @add; 
for my $i (@delete) { 
    $_ > $i && --$_ for @add; 
} 

while (my $line = <>) { 
    chomp $line; 
    my @columns = split /,/, $line; 
    splice @columns, $_, 1  for @delete; 
    splice @columns, $_, 0, q() for @add; 
    say join ',', @columns; 
} 
+0

私には、私はインデックスが変更するには、列を追加したい場合。 'C1、C2、C3、C8、C9'という参照ヘッダーを持っているので、ヘッダーが' C1、C2、C8、C9、C10 'のような他の行は参照ヘッダーごとに作成する必要があります。2番目のヘッダの欠けているカラムは '、'で置き換えられなければならないので 'C1、C2、、C8、C9'のようになります。注C10が削除され、C3の欠落は '、 'に置き換えられます。 – Invictus

+0

@Invictus:わかりません。 – choroba

関連する問題