1

このような同様のエントリを含む大きなテキスト ファイルがあります。

ここでの私の目標は、親フォルダーが存在するかどうかを特定することです。つまり、たとえば /FS7_100x/FILE04 がこのフォルダーの親フォルダーになるかどうかを確認することです: /FS7_100x/FILE04/BU-D/PROJECT CONTROL OFFICE

これら 2 つのパスの関係は、ある時点で同じパスを共有するということです。なぜ私はこれをしたいのですか?これを行うことで、そのパスで使用されているスペースが親フォルダーで既にカウントされているかどうかがわかるためです。

3 番目のフィールドにはファイルシステム パスが入力されます。パスの末尾にスラッシュ / を追加して、各行の各パスを同じファイル、同じ 3 番目のフィールドと比較したいと考えています。つまり: 比較: /FS7_100x/FILE04/BU-D/PROJECT CONTROL OFFICE vs /FS7_100x/FILE04/BU-D/PROJECT CONTROL OFFICE & /FS3_200g/FILE12/BU/AGENCY/GOLDMINE & /FS3_200g/FILE12

たとえば、/FS7_100x/FILE04/ と /FS3_200g/FILE12/ を検索したい

ファイル1

\\FILE04\BUET-PCO;\\SERVER24\OFFICE;/FS7_100x/FILE04/BU-D/PROJECT CONTROL;
\\FILE12\BUAG-GOLDMINE$;\\SERVER24\GOLDMINE;/FS3_200g/FILE12/BU/AGENCY/GOLDMINE;
\\x\a$;\\SERVER24\DFS\somethingelse;/FS3_200g/FILE12;
\\z\o;\\SERVER24\DFS\blah;/FS7_100x/FILE04;

フィールドは「;」で区切られます

このようにして、親フォルダーが既に file1 にリストされていることを確認できます。行末 (別の行に既に含まれている行) にいくつかの単語を追加したいと考えています。 #

望ましい出力:

\\FILE04\BUET-PCO;\\SERVER24\OFFICE;/FS7_100x/FILE04/BU-D/PROJECT CONTROL;Physical path is a subfolder of Line#4
\\FILE12\BUAG-GOLDMINE$;\\SERVER24\GOLDMINE;/FS3_200g/FILE12/BU/AGENCY/GOLDMINE;Physical path is a subfolder of Line#3
\\x\a$;\\SERVER24\DFS\somethingelse;/FS3_200g/FILE12;
\\z\o;\\SERVER24\DFS\blah;/FS7_100x/FILE04;

私がしたこと:

setlocal enableextensions 
del lugares.csv
for /f "tokens=1,2,3 delims=;" %%i in (file1.csv) do (
for /f "tokens=*" %%p in ('findstr /N /i /r /C:"%%k/" file1.csv') do (
echo Original %%k;%%i;%%j; --- repeated with Line# %%p >>dupli.txt
)
)
pause

dupli.txt という新しいファイルを作成したくありません。すべてのデータを元のファイル file1.csv に追加したいので、私のソリューションはうまくいきません。

4

1 に答える 1

2

これには使用できますが、これはそのために構築されたsedものだと思います。awk

テキストファイルが非常に長い場合は、これを2つのパスで実行するのが最も理にかなっていると思います。そのため、すべてをメモリにロードする必要はありません。

まず、潜在的な親のリストを取得します。

awk -F\; '{print $3}' file1 > paths.txt

次に、それを配列に読み込み、ファイル内の他の行と比較します。ファイルを呼び出しましたpathrefs.awk。コマンドラインは次のようになります。

awk -f pathrefs.awk paths.txt file1

内容pathrefs.awkは次のとおりです。

BEGIN {
        FS=";"
}

# First, process the paths.txt file...
NR==FNR {
        paths[$0"/"]=NR;
        next;
}

# Next, process the second file, using data gathered from the first file.
{
        delete ref;

        # Make a reference list of paths that match the current line's $3
        for (i in paths) {
                if (index($3,i)==1) {
                        ref[paths[i]];
                }
        }

        # If we found anything...
        if (length(ref)) {
                 $0=$0 "Parent:";
        }

        # Show the list.
        for (i in ref) {
                $0=$0 " #" i;
        }
}

# This is short-hand for "print;"
1

これが私が使用したサンプル入力データです:

this;abcde;/FS7_100x/FILE04/BU-D/PROJECT CONTROL OFFICE;;;;;;;;;;
that;bcdef;/FS3_200g/FILE12/BU/AGENCY/GOLDMINE;;;;;;;;;;;
foo;cdefg;/FS3_200g/FILE12;;;;;;;;
bar;defgh;/FS7_100x/FILE04;;;;;;;;;;;
baz;efghi;/FS7_100x/FILE04/BU-D;;;;;;;;;;;

そして、スクリプトが生成した出力は次のとおりです。

this;abcde;/FS7_100x/FILE04/BU-D/PROJECT CONTROL OFFICE;;;;;;;;;;Parent: #4 #5
that;bcdef;/FS3_200g/FILE12/BU/AGENCY/GOLDMINE;;;;;;;;;;;Parent: #3
foo;cdefg;/FS3_200g/FILE12;;;;;;;;
bar;defgh;/FS7_100x/FILE04;;;;;;;;;;;
baz;efghi;/FS7_100x/FILE04/BU-D;;;;;;;;;;;Parent: #4

StackOverflowで結果がより適切に表示されるように、質問で指定した表現から表現を変更したことに注意してください。の代わりに好きなものを使用してください"Parent:"

ファイル全体をメモリにロードするためのメモリ要件を処理できると思われる場合は、プロセス全体を1つのスクリプトに書き込むことができる場合があります。これまでに書いたことは、使用するロジックについて説明しています。

于 2012-10-03T20:32:07.280 に答える