1

zipファイルがあります。解凍すると、それぞれにreport.csvというcsvが含まれるサブフォルダーがいくつかあります。

the_folder/
    1234/report.csv
    abcd/report.csv
    jklm/report.csv
    5678/report.csv

各CSVには、次のような列とコンテンツがあります。

almonds, biscuits, cookies, dog_biscuits 
123, 321, 333, 444
555, 666, 777, 888
444, 551, 555, 999 (and so on for 75 lines or so)

それらを結合されたCSVファイルに入れたいです。私はこれを行うためにPHPファイルでexecを使用していました:

exec("cat /path/the_folder/*/report.csv > /path/combined.csv");

次に、sedを使用して、重複する「アーモンド、ビスケット、クッキー、dog_biscuits」ヘッダー行を削除します。

次に、サブフォルダーの名前を取得して、combined.csvの行に配置する必要があります。

そのため、CSVに列( "subfolder_name")が追加され、その列にその行の元となったフォルダーの名前が追加されます。何かのようなもの

almonds, biscuits, cookies, dog_biscuits, subfolder_name
123, 321, 333, 444, 1234
555, 666, 777, 888, 1234
444, 551, 555, 999, abcd
333, 333, 111, 222, abcd
111, 222, 444, 333, abcd (etc and so on for 300 lines)

これを行うための最も賢く、最も単純で、最も効率的な方法は何ですか?

4

3 に答える 3

0

あなたが試すことができます

$folderList = array (
        "1234/report.csv",
        "abcd/report.csv",
        "jklm/report.csv",
        "5678/report.csv" 
);

$combinedCSV = "result_combine.csv";
$headers = array (
        "almonds",
        "biscuits",
        "cookies",
        "dog_biscuits" 
);
touch ( $combinedCSV );

$fp = fopen ( $combinedCSV, 'w' );
fputcsv ( $fp, $headers ); // Add headers
foreach ( $folderList as $file ) {
    if (($handle = fopen ( $file, "r" )) !== FALSE) {
        while ( ($data = fgetcsv ( $handle, 1000, "," )) !== FALSE ) {
            if ($data [0] == "almonds") // Remove Headers
                continue;
            fputcsv ( $fp, $data );
        }
        fclose ( $handle );
    }
}

fclose($fp);

お役に立てば幸いです

ありがとう

于 2012-04-12T00:21:19.743 に答える
0

これを試して:

$folder_list = array(); // USE YOUR CODE TO GET FOLDER LIST
$combined_output = "";
$folder_i = 0;
foreach ($folder_list as $folder) {
   $file = file($folder . "/report.csv");
   foreach ($file as $line_i => $line) {
      if (($folder_i == 0 && $line_i == 0) || $line_i > 0) {
         $combined_output .= $line . PHP_EOL;
      }
   }
   $folder_i++;
}

$f = fopen("combined.csv", "w+");
fwrite($f, $combined_output);
fclose($f);
于 2012-04-12T00:06:22.440 に答える
0

TXR:

@header
@(output)
@header, subfolder_name
@(end)
@(next :args)
@(collect)
@folder/@subfolder/@file.csv
@  (next `@folder/@subfolder/@file.csv`)
@header
@  (collect :vars ())
@line
@    (output)
@line, @subfolder
@    (end)
@  (end)
@(end)

走る:

$ txr catname.txr folder/*/*.csv
animal, sound, subfolder_name
dog, bark, abcd
horse, neigh, abcd
cat, meow, efgh
cow, moo, efgh

データ:

$ ls -R folder/
folder/:
abcd  efgh

folder/abcd:
a.csv

folder/efgh:
e.csv

$ cat folder/abcd/a.csv 
animal, sound
dog, bark
horse, neigh

$ cat folder/efgh/e.csv 
animal, sound
cat, meow
cow, moo
于 2012-04-13T17:19:37.500 に答える