web-dev-qa-db-ja.com

Unix:最初のファイルのヘッダーを保持して、同じヘッダーを持つ複数のCSVファイルをマージする

同じヘッダーを持つ複数のCSVファイルをマージする必要があります。最初のファイルのヘッダーを保持し、他のすべてのファイルのヘッダーを削除して、それらをマージして1つのマスターファイルを作成する必要があります。

ファイル1:

Id,city,name ,location
1,NA,JACK,CA

ファイル2:

ID,city,name,location
2,NY,JERRY,NY

出力:

Id,city,name,location
1,NA,JACK,CA
2,NY,JERRY,NY

現在、私はこのコードを使用しています:

ls *.csv | xargs -n 1 tail -n+2 > master.csv

このコードはファイルを完全にマージしますが、最初のファイルのヘッダーが必要なため、ヘッダーが表示されません。

私は何をすべきか?

27
user2376510
awk 'FNR==1 && NR!=1{next;}{print}' *.csv

solaris unixでテスト:

> cat file1.csv
Id,city,name ,location
1,NA,JACK,CA
>
> cat file2.csv
ID,city,name,location
2,NY,JERRY,NY
>
> nawk 'FNR==1 && NR!=1{next;}{print}' *.csv
Id,city,name ,location
1,NA,JACK,CA
2,NY,JERRY,NY
> 

kevin-d による説明:

FNRは、現在のファイルでこれまでに読み取られた行(レコード)の数です。 NRは、全体的に読み取られた行数です。したがって、条件「FNR == 1 && NR!= 1 {next;}」は、「現在のファイルの最初の行であり、少なくとも1行が全体的に読み取られている場合は、この行をスキップします」と言います。これにより、最初のファイルのCSVヘッダーが印刷され、残りのファイルはスキップされます。

Linkawknawk の違い

62
Vijay
<?php
ini_set('auto_detect_line_endings', true);
$dir = "include/*.csv";
$returnVal = array();
foreach (glob($dir) as $file) {
    $header = null;
    $file = fopen($file, 'r') or die('Unable to open file!');
    while(($row = fgetcsv($file)) !== false){
        if($header === null){
            $header = $row;
            continue;
        }
        $newRow = array();
        for($i = 0; $i<count($row); $i++){

            $newRow[] = $row[$i];   
        }
        if($newRow[0] == null)
        break;
        else
        $returnVal[] = $newRow;
    }
    fclose($file);
}
//var_dump($returnVal);
$output = fopen("file.csv",'w') or die("Can't open output");
fputcsv($output, array('Date','close','open'));
foreach($returnVal as $product) {
    fputcsv($output, $product);
}

fclose($ output)またはdie( "php:// outputを閉じることができません"); ?>

0
Mahmudul Hasan

Perlがオプションの場合:

Perl -ne 'print if $. > 1 or ! $h; $h=1; close ARGV if eof' *.csv > master.csv

$.は行番号です。
ファイル間で自動的にリセットされないため、close ARGV if eofが必要です。
$hヘッダーがすでに印刷されているかどうかを記録します。

0
Chris Koknat