2016-03-31 1 views
0

Ich bin auf der Suche nach einem einzigen csv aus vielen csvs in einem Verzeichnis zu erstellen. Ich weiß, dass dies viele Male abgedeckt wurde, aber ich habe eine leichte Wendung. Dinge, die ich tun möchte:Erstellen Sie einzelne CSV aus mehreren CSVs in einem Verzeichnis 1. CSV kopieren Sie beide Spalten nach dem csv nur die zweite Spalte

  1. Finden Sie die größte Datei.
  2. Mit der größten Datei - verwenden Sie das als Basis. Die erste Spalte in der größten Datei wird der Primärschlüssel sein, den ich brauche, um den Rest der Dateien zusammenzuführen.
  3. Vergleichen Sie jede Datei im Verzeichnis mit dem Primärschlüssel aus der ersten CSV und fügen Sie die zweite Spalte jedes CSV zum größten.

Damit wird gesagt i mit der folgenden arbeite:

ich diesen Link eine Spalte von einer csv zum anderen zu nehmen gefunden.

https://askubuntu.com/questions/553219/add-column-from-one-csv-to-another-csv-file

Ich kann so etwas wie dies nutzen, um die Spalte von einem zum anderen hinzuzufügen.

paste -d, file2 <(cut -d, -f3- file1) 

Die folgende PHP wird mir die Dateiliste für ein Verzeichnis erhalten jetzt zu kombinieren/fusionieren die CSVs versuchen PHP zu nutzen.

$dir= $Folder.'/Stats/Latency/'; // directory name 
$ar=scandir($dir); 
$box=$_POST['box']; // Receive the file list from form 

// Looping through the list of selected files /// 
while (list ($key,$val) = @each ($box)) { 
$path=$dir ."/".$val; 
$dest = $Folder."/Report/Latency/".$val; 
if(copy($path, $dest)); //echo "Copy Complete file "; 
echo "$val,"; 
} 
echo "<hr>"; 

Dies ist, wo ich die CSV unten fusionieren müssen: Ich debattieren die Shell exec-Befehle zu verwenden, aber das scheint sehr arbeitsintensiv.

$reportFiles = $Folder."/Report/Latency/"; 
foreach(glob($reportFiles."*.csv") as $file) 
{ 
    shell_exec("touch "$reportFiles."latencyReport.csv"); 

} 

Da es bezieht sich auf die Daten in der CSV-Dateien:

CSV1:

date,vpool06 
2016-03-28 12:00:00,0.000 
2016-03-28 12:01:00,0.000 
2016-03-28 12:02:00,0.000 
2016-03-28 12:03:00,0.000 
2016-03-28 12:04:00,0.000 
2016-03-28 12:05:00,0.000 
2016-03-28 12:06:00,0.000 
2016-03-28 12:07:00,0.000 
2016-03-28 12:08:00,0.000 
2016-03-28 12:09:00,0.000 
2016-03-28 12:10:00,0.000 
2016-03-28 12:11:00,0.000 
2016-03-28 12:12:00,0.000 
2016-03-28 12:13:00,0.000 
2016-03-28 12:14:00,0.000 
2016-03-28 12:15:00,0.000 
2016-03-28 12:16:00,0.000 
2016-03-28 12:17:00,0.000 
2016-03-28 12:18:00,0.000 
2016-03-28 12:19:00,0.000 

CSV2:

date,vpool02 
2016-03-28 12:00:00,0.000 
2016-03-28 12:01:00,0.000 
2016-03-28 12:02:00,0.000 
2016-03-28 12:04:00,0.000 
2016-03-28 12:05:00,0.000 
2016-03-28 12:06:00,0.000 
2016-03-28 12:07:00,0.000 
2016-03-28 12:08:00,0.000 
2016-03-28 12:09:00,0.000 
2016-03-28 12:10:00,0.000 
2016-03-28 12:11:00,0.000 
2016-03-28 12:12:00,0.000 
2016-03-28 12:13:00,0.000 
2016-03-28 12:14:00,0.000 

CSV3:

date,vpool03 
2016-03-28 12:00:00,0.000 
2016-03-28 12:01:00,0.000 
2016-03-28 12:02:00,0.000 
2016-03-28 12:04:00,0.000 
2016-03-28 12:05:00,0.000 

Eingebunden CSV:

date,vpool06,vpool02,vpool03 
2016-03-28 12:00:00,0.000,0.000,0.000 
2016-03-28 12:01:00,0.000,0.000,0.000 
2016-03-28 12:02:00,0.000,0.000,0.000 
2016-03-28 12:03:00,0.000,,0.000 
2016-03-28 12:04:00,0.000,0.000,0.000 
2016-03-28 12:05:00,0.000,0.000,0.000 
2016-03-28 12:06:00,0.000,0.000, 
2016-03-28 12:07:00,0.000,0.000, 
2016-03-28 12:08:00,0.000,0.000, 
2016-03-28 12:09:00,0.000,0.000, 
2016-03-28 12:10:00,0.000,0.000, 
2016-03-28 12:11:00,0.000,0.000, 
2016-03-28 12:12:00,0.000,0.000, 
2016-03-28 12:13:00,0.000,0.000, 
2016-03-28 12:14:00,0.000,0.000, 
2016-03-28 12:15:00,0.000,, 
2016-03-28 12:16:00,0.000,, 
2016-03-28 12:17:00,0.000,, 
2016-03-28 12:18:00,0.000,, 
2016-03-28 12:19:00,0.000,, 

Im Idealfall ist mir egal, ob es eine „Null“ Wert an dieser Stelle ist, weil es einfach nicht in der Grafik angezeigt. Das bedeutet, dass der Server zu der Zeit ausgeschaltet war.

Muss in den Leerstellen, in denen keine Daten vorhanden sind, null sein.
Update: Beispiel.

date,vpool06,7NA_01,7NA_02,bd01,bd02,vpool01,vpool02,vpool03,vpool04,vpool07 
2016-03-28 12:00:00,1.000,null,10.00,02.00,20.00,0.00,0.00,0.00,0.00,0.000 
2016-03-28 12:01:00,0.000,11.00,110.00,null,11.00,0.00,0.00,0.00,0.00,0.000 
2016-03-28 12:02:00,0.000,null,0.00,2.00,100,0.00,0.00,0.00,0.00,0.000 
2016-03-28 12:03:00,0.000,0.00,0.00,02.00,10.00,0.00,0.000,0.00,0.00,0.000 
+1

'2016.03.28 12: 03: 00,0.000, ist 0.000' nicht im Einklang mit dem Eingang – karakfa

+1

"größte Datei" Define-Dateien. Die meisten Zeilen, die meisten Spalten, die meisten Bytes, noch etwas? Stellen Sie außerdem klar, ob Sie eine PHP-Lösung oder eine AWK-Lösung oder etwas anderes benötigen. –

+1

Most Rows - dachte nie daran ... große Frage - wenn ich die meisten Zeilen machen könnte, wäre das noch besser. PHP wäre die beste Option - weil ich ein Select-Skript erstelle, das die Dateien in dieses Verzeichnis verschiebt - und danach die Dateien kombinieren und zusammenführen kann. – Jared

Antwort

1

Ich habe keine Ahnung, wie würden Sie tun, dass in PHP aber mit GNU awk für echte 2D-Arrays und sortiert "in" es wäre:

$ cat tst.awk 
BEGIN { FS=OFS="," } 
FNR==1 { hdr[ARGIND][1]=$1; hdr[ARGIND][2]=$2; next } 
{ arr[ARGIND][$1] = $2 } 
END { 
    for (idx in arr) { 
     numRows = length(arr[idx]) 
     if (numRows > maxRows) { 
      maxRows = numRows 
      maxIdx = idx 
     } 
    } 

    printf "%s%s%s", hdr[maxIdx][1], OFS, hdr[maxIdx][2] 
    for (idx=1; idx<=ARGIND; idx++) { 
     if (idx != maxIdx) { 
      printf "%s%s", OFS, hdr[idx][2] 
     } 
    } 
    print "" 

    PROCINFO["sorted_in"] = "@ind_str_asc" 
    for (tstamp in arr[maxIdx]) { 
     printf "%s%s%s", tstamp, OFS, arr[maxIdx][tstamp] 
     for (idx=1; idx<=ARGIND; idx++) { 
      if (idx != maxIdx) { 
       printf "%s%s", OFS, (tstamp in arr[idx] ? arr[idx][tstamp] : "null") 
      } 
     } 
     print "" 
    } 
} 

.

$ awk -f tst.awk csv3 csv2 csv1 
date,vpool06,vpool03,vpool02 
2016-03-28 12:00:00,0.000,0.000,0.000 
2016-03-28 12:01:00,0.000,0.000,0.000 
2016-03-28 12:02:00,0.000,0.000,0.000 
2016-03-28 12:03:00,0.000,null,null 
2016-03-28 12:04:00,0.000,0.000,0.000 
2016-03-28 12:05:00,0.000,0.000,0.000 
2016-03-28 12:06:00,0.000,null,0.000 
2016-03-28 12:07:00,0.000,null,0.000 
2016-03-28 12:08:00,0.000,null,0.000 
2016-03-28 12:09:00,0.000,null,0.000 
2016-03-28 12:10:00,0.000,null,0.000 
2016-03-28 12:11:00,0.000,null,0.000 
2016-03-28 12:12:00,0.000,null,0.000 
2016-03-28 12:13:00,0.000,null,0.000 
2016-03-28 12:14:00,0.000,null,0.000 
2016-03-28 12:15:00,0.000,null,null 
2016-03-28 12:16:00,0.000,null,null 
2016-03-28 12:17:00,0.000,null,null 
2016-03-28 12:18:00,0.000,null,null 
2016-03-28 12:19:00,0.000,null,null 
+0

Ich testete dies funktioniert - aber nach dem Test dygraphs erfordern 'Null'-Wert, wenn keine Daten in einer Spalte sind. Beispiel in der Hauptfrage. Gibt es eine Möglichkeit, den Zellen, die keine Daten haben, Null hinzuzufügen? – Jared

+0

Warum würden Sie eine neue Beispielausgabe hinzufügen, die nichts mit Ihrer Eingabe zu tun hat, anstatt nur die ursprüngliche Ausgabe zu korrigieren? Das wäre viel einfacher und klarer gewesen. Wie auch immer, ich habe meine Antwort aktualisiert, um das zu tun, was ich jetzt DENKE denke. –

1

awk zur Rettung!

$ awk -F, -v OFS=, 'FNR==1{c++} {a[$1,c]=$2;keys[$1]} 
         END{for(k in keys) 
          {printf "%s", k; 
          for(i=1;i<=c;i++) 
           printf "%s", OFS (((k,i) in a)?a[k,i]:""); 
          print ""}}' file{1,2,3} | 
sort -t, -k1,1 | 
tee >(sed '$d' > merged) >(tail -1 >> merged) 

$ cat merged 

date,vpool06,vpool02,vpool03                       
2016-03-28 12:00:00,0.000,0.000,0.000                     
2016-03-28 12:01:00,0.000,0.000,0.000 
2016-03-28 12:02:00,0.000,0.000,0.000 
2016-03-28 12:03:00,0.000,, 
2016-03-28 12:04:00,0.000,0.000,0.000 
2016-03-28 12:05:00,0.000,0.000,0.000 
2016-03-28 12:06:00,0.000,0.000, 
2016-03-28 12:07:00,0.000,0.000, 
2016-03-28 12:08:00,0.000,0.000, 
2016-03-28 12:09:00,0.000,0.000, 
2016-03-28 12:10:00,0.000,0.000, 
2016-03-28 12:11:00,0.000,0.000, 
2016-03-28 12:12:00,0.000,0.000, 
2016-03-28 12:13:00,0.000,0.000, 
2016-03-28 12:14:00,0.000,0.000, 
2016-03-28 12:15:00,0.000,, 
2016-03-28 12:16:00,0.000,, 
2016-03-28 12:17:00,0.000,, 
2016-03-28 12:18:00,0.000,, 
2016-03-28 12:19:00,0.000,, 
+0

Was haben wir vor der Prozess-Substitution ('> (cmd ...)') gemacht? ;-) Wie immer eine lehrreiche, aber knappe Antwort. Viel Glück für jeden. – shellter

Verwandte Themen