it-swarm.com.de

Unix: Zusammenführen mehrerer CSV-Dateien mit demselben Header, indem der Header der ersten Datei beibehalten wird

Ich muss mehrere CSV-Dateien mit denselben Kopfzeilen zusammenführen. Ich muss die Kopfzeile der ersten Datei beibehalten und die Kopfzeilen aller anderen Dateien entfernen, sie zusammenführen und eine Master-Datei erstellen.

datei 1:

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

datei 2:

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

ausgabe:

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

Derzeit verwende ich diesen Code:

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

Dieser Code fügt die Dateien perfekt zusammen, aber da ich den Header der ersten Datei benötige, wird mir der Header nicht angezeigt.

Was soll ich machen?

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

getestet auf 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
> 

Erklärung gegeben von kevin-d :

FNR ist die Anzahl der bisher gelesenen Zeilen (Datensätze) in der aktuellen Datei. NR ist die Anzahl der insgesamt gelesenen Zeilen. Die Bedingung 'FNR == 1 && NR! = 1 {next;}' sagt also: "Überspringen Sie diese Zeile, wenn es sich um die erste Zeile der aktuellen Datei Handelt und mindestens eine Zeile hat wurde insgesamt gelesen. " Dies hat den Effekt , Wenn der CSV-Header der ersten Datei gedruckt wird, während im übrigen Übersprungen wird.

Link für den Unterschied zwischen awk und nawk

56
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) oder die ("Kann die Ausgabe von php: // nicht schließen") ?>

0
Mahmudul Hasan

Wenn Perl eine Option ist:

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

$. ist die Zeilennummer.
Es wird NICHT automatisch zwischen Dateien zurückgesetzt, daher ist close ARGV if eof erforderlich.
$h zeichnet auf, ob die Kopfzeile bereits gedruckt wurde. 

0
Chris Koknat