bestimmte Zeile einer csv finden und löschen

Wie geschrieben, ich habe schon lange keine Erfahrung mehr mit bash und ich hatte die betr. Zeile nur von Stackoverflow übernommen und dort eingefügt. Auch kein Linux zur Hand um es zu testen.
Was genau funktioniert denn nicht, läuft das Skript überhaupt nicht mehr oder sind nur die leeren Zeilen immer noch drin? Wenn letzteres, dann mal mit echo checken, ob diese temp. Datei wirklich leer ist.
 
Dann bin ich leider überfragt. Aber wenn Du es am liebsten ohne WSL machen würdest, würde sich als Alternative Powershell oder Python anbieten.
 
ja, wäre recht, nur muss ich da von vorne anfangen mit der Recherche

ich hab nochmal das Lankabel gezogen und somit einen Verbindungsabbruch provoziert. Die leere Zeile wird so eingetragen

Code:
29.12.2022 13:18;7;11,7;7,5;82,5;77,0;147,6;80;80;47;49;0;0;100;0;155;37;75;0;16;10;140;1000;65,1;0;6,6;3,4;75,5;120;73,1;-20;-20;2;-0;0;0;0;0;3;0;0;0;0;100;2;0;103;5,6;0;100;0;0;13;120;30;-20;26,6;27;24;18;1;1;46,4;45;23,7;12,3;1;1;50,3;47;20;20;1;1;-20;0;20;20;0;1;-20;0;20;20;0;1;-20;0;20;20;0;1;-20;0;20;20;0;1;-20;0;20;20;0;1;21,7;0;76,5;0;-20;0;-20;0;-20;0;0;47;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;67,2;0;93707,5;100;3;3;3;0;1;6;0;0;0;0;0;0;0;7,99;12,62;633;0;10;3;0;0;0;47;0;0;49F;1001;7D00;0;0;0;0;200;
29.12.2022 13:16;7;7,2;7,6;82,0;77,0;151,6;75;74;14;14;0;0;92;0;146;43;75;0;16;10;140;1000;63,5;0;6,6;3,4;75,2;120;72,3;-20;-20;2;-0;0;0;0;0;3;0;0;0;0;99;2;0;105;14,9;0;100;0;0;13;120;30;-20;26,6;27;24;18;1;1;46,9;45;23,7;12,3;1;1;50,0;47;20;20;1;1;-20;0;20;20;0;1;-20;0;20;20;0;1;-20;0;20;20;0;1;-20;0;20;20;0;1;-20;0;20;20;0;1;21,7;0;75,7;0;-20;0;-20;0;-20;0;0;47;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;67,2;0;93707,5;100;3;3;3;0;1;6;0;0;0;0;0;0;0;8,00;12,60;635;0;10;3;0;0;0;47;0;0;49F;1001;7D00;0;0;0;0;200;
29.12.2022 13:14
29.12.2022 13:12;5;7,0;7,6;77,0;78;126,5;51;51;10;9;0;0;93;93;81;67;75;0;16;10;140;1000;66,4;65;6,4;3,4;74,9;120;70,8;-20;-20;2;-0;724;454;3;0;3;0;0;0;0;99;3;78;101;15,6;0;100;0;0;13;120;30;-20;26,4;27;24;18;1;1;46,4;45;23,7;12,3;1;1;46,1;47;20;20;1;1;-20;0;20;20;0;1;-20;0;20;20;0;1;-20;0;20;20;0;1;-20;0;20;20;0;1;-20;0;20;20;0;1;21,7;0;75,7;0;-20;0;-20;0;-20;0;0;47;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;67,2;0;93704,4;100;3;3;3;0;1;6;0;0;0;0;0;0;0;8,00;12,59;635;93;10;3;0;0;0;52;71;0;49F;1041;7C00;0;0;0;0;200;
29.12.2022 13:10;5;7,9;7,5;76,5;78;125,8;55;55;17;15;0;0;100;79;88;70;75;0;16;10;140;1000;65,9;65;6,4;3,4;74,7;120;70,3;-20;-20;2;-0;735;0;3;0;3;0;0;0;0;99;3;78;98;13,2;0;100;0;0;13;120;29;-20;26,4;27;24;18;1;1;46,4;45;23,7;12,3;1;1;44,6;47;20;20;1;1;-20;0;20;20;0;1;-20;0;20;20;0;1;-20;0;20;20;0;1;-20;0;20;20;0;1;-20;0;20;20;0;1;21,7;0;75,5;0;-20;0;-20;0;-20;0;0;47;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;65,2;0;93702,6;100;3;3;3;0;1;6;0;0;0;0;0;0;0;8,01;12,59;636;79;10;3;0;0;0;52;71;0;49F;1041;7C00;0;0;0;0;200;
29.12.2022 13:08;5;7,8;7,6;77,8;78;126,7;51;50;7;9;0;0;91;31;83;89;75;0;16;10;140;1000;65,9;65;6,4;3,5;74,7;120;69,5;-20;-20;2;-0;7;0;0;0;3;0;0;0;0;99;3;78;103;13,4;0;100;0;0;13;120;29;-20;26,4;26;24;18;1;1;46,1;45;23,7;12,3;1;1;43,8;46;20;20;1;1;-20;0;20;20;0;1;-20;0;20;20;0;1;-20;0;20;20;0;1;-20;0;20;20;0;1;-20;0;20;20;0;1;21,7;0;75,5;0;-20;0;-20;0;-20;0;0;46;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;63,1;0;93701,5;100;3;3;3;0;1;6;0;0;0;0;0;0;0;8,01;12,59;636;31;10;3;0;0;0;51;71;0;49F;1001;7C00;0;0;0;0;200;
 
Aber wenn Du es am liebsten ohne WSL machen würdest, würde sich als Alternative Powershell oder Python anbieten.
Ich bin natürlich ein großer Freund von Python. Für solche Logging-Aufgaben ist BASH aber tatsächlich perfekt. Mit Python wäre allerdings der Umzug auf Windows gar kein Problem. Falls du also lieber ein Python-Skript bemühen möchtest @cliodriver , können wir das gerne machen.

Ich habe trotzdem mal versucht dein Skript ein wenig umzuschreiben. Anstatt alles in Dateipuffern zu erledigen, wird es jetzt direkt im Bash-Skript gemacht. Theoretisch müsste das so laufen, allerdings kann ich es nicht testen, da ich ja die Originalausgabe des netcat-Befehls nicht habe.
Bash:
!/bin/bash
# shellscript zum Loggen von Telnet Daten einer Hargasser ECO HK40 Baujahr 2015
# Die daten werden in einer Excel konformen CSV Datei gespeichert
while true; do
  # Der aktuelle Zeitstempel wird in einer Variablen gespeichert
  timestamp=$(date +%d.%m.%Y" "%H:%M)
 
  # 10 Sekunden wird an Telnet gelauscht und in eine Variable geschrieben
  answer=$(timeout 10 nc 192.168.1.25 23)

  # Teste ob Ausgabe etwas enthält
  size=${#answer}

  # Wenn die Antwort mehr als 10 Zeichen lang ist
  if [ $size -gt 10 ]; then
    # Für eine Weitervearbeitung in Excel werden nun Punkte durch Komma ersetzt
    answer=$(echo "$answer" | sed 's/\./,/g')
    
    # Das "pm" am Anfang der Zeile entfernen
    answer=$(echo "$answer" | sed 's/\pm //g')
    
    # Um eine Excel csv Datei zu erstellen werden nun Leerzeichen durch Semikolon ersetzt
    answer=$(echo "$answer" | sed 's/ /;/g')
    
    # Auf 600 Zeichen kürzen
    answer=$(echo "$answer" | sed -r 's/(.{600}).*/\1/;q')
    
    # Erzeuge Log-Zeile, die später an den Anfang der Logdatei kopiert werden soll
    logline="$timestamp;$answer"
    
    # Lies die letzten 9999 Zeilen der Logdatei ein
    history=$(head -n 9999 /home/server/hargassner/hargassner.csv)
    
    # Und schreibe die Logdatei neu (mit logline ganz oben)
    echo "$logline\n$history" > /home/server/hargassner/hargassner.csv
    
    # Aktualisiere im Remote-Verzeichnis
    cp -R /home/server/hargassner /mnt/c/Web/Apache24/htdocs/csvlog
  else
    echo "Hier könnte man loggen, dass etwas schief gegangen ist."
  fi
  # Wiederhole nach 2 Minuten
  sleep 2m
done

Die Ausgabe wird aufgefangen und nur in die Logdatei geschrieben, wenn sie mindestens 10 Zeichen lang ist (diesen Wert muss man halt per Hand einstellen).

Falls es nicht läuft bitte eine genaue Fehlerbeschreibung liefern. Ich bin hier wie gesagt im Blindflug unterwegs.

Gruß Technipion
 
original datenzeile

Code:
pm 1 1.2 7.5 79.6 0 75.5 0 0 0 0 0 0 0 0 15 6 75 0 19 10 140 1000 65.6 58 7.2 3.9 76.0 120 74.2 -20 -20 2 -0 0 0 0 0 3 0 0 0 0 100 2 0 104 50.5 0 100 0 0 13 120 28 -20 26.6 26 24 18 1 1 43.3 45 23.7 12.3 1 1 43.8 46 20 20 1 1 -20 0 20 20 0 1 -20 0 20 20 0 1 -20 0 20 20 0 1 -20 0 20 20 0 1 -20 0 20 20 0 1 21.7 0 77.5 0 -20 0 -20 0 -20 0 0 46 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 67.2 0 93707.5 100 3 3 3 0 1 6 0 0 0 0 0 0 0 0 0 2 0 10 3 0 0 0 46 0 0 49B 1000 7800 0 0 0 0 200
 
getestet

in Zeile 35 musste das "\n" raus. dies wurde vor das Datum geschrieben

dann sehen alle Zeilen korrekt aus, doch Grafana meckert beim auswerten das in Zeile 2 nicht die korrekte Anzahl von Feldern ist. Ich finde aber keinen Fehler

Code:
29.12.2022 20:11;1;1,2;7,5;63,5;0;60,4;0;0;0;0;0;0;0;0;12;3;75;0;20;10;140;1000;54,9;58;0,7;1,0;71,6;120;59,9;-20;-20;0;-0;0;0;0;0;3;0;0;0;0;96;2;0;105;50,5;0;100;0;0;13;120;27;-20;28,7;28;24;18;1;1;44,8;45;23,9;12,1;1;1;49,0;50;20;20;1;1;-20;0;20;20;0;1;-20;0;20;20;0;1;-20;0;20;20;0;1;-20;0;20;20;0;1;-20;0;20;20;0;1;21,7;0;76,0;0;-20;0;-20;0;-20;0;0;50;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;73,2;0;93779,2;100;3;3;3;0;1;6;0;0;0;0;0;0;0;0;0;2;0;10;3;0;0;0;50;0;0;49B;1000;7800;0;0;0;0;200;
29.12.2022 19:59;1;1,2;7,5;66,6;0;63,2;0;0;0;0;0;0;0;0;13;3;75;0;20;10;140;1000;56,8;58;0,9;1,1;72,3;120;63,3;-20;-20;0;-0;0;0;0;0;3;0;0;0;0;97;2;0;105;50,5;0;100;0;0;13;120;27;-20;28,7;28;24;18;1;1;43,5;45;23,9;12,1;1;1;50,0;50;20;20;1;1;-20;0;20;20;0;1;-20;0;20;20;0;1;-20;0;20;20;0;1;-20;0;20;20;0;1;-20;0;20;20;0;1;21,7;0;76,2;0;-20;0;-20;0;-20;0;0;50;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;73,2;0;93779,2;100;3;3;3;0;1;6;0;0;0;0;0;0;0;0;0;2;0;10;3;0;0;0;50;0;0;49B;1000;7800;0;0;0;0;200;
29.12.2022 19:57;1;1,2;7,5;66,9;0;64,1;0;0;0;0;0;0;0;0;13;3;75;0;20;10;140;1000;56,2;58;0,9;1,1;72,3;120;63,8;-20;-20;0;-0;0;0;0;0;3;0;0;0;0;97;2;0;105;50,5;0;100;0;0;13;120;27;-20;28,7;28;24;18;1;1;43,5;45;23,9;12,1;1;1;50,0;50;20;20;1;1;-20;0;20;20;0;1;-20;0;20;20;0;1;-20;0;20;20;0;1;-20;0;20;20;0;1;-20;0;20;20;0;1;21,7;0;76,2;0;-20;0;-20;0;-20;0;0;50;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;73,2;0;93779,2;100;3;3;3;0;1;6;0;0;0;0;0;0;0;0;0;2;0;10;3;0;0;0;50;0;0;49B;1000;7800;0;0;0;0;200;
29.12.2022 19:54;1;1,2;7,5;67,4;0;65,3;0;0;0;0;0;0;0;0;13;3;75;0;20;10;140;1000;50,5;58;1,2;1,4;72,6;120;64,0;-20;-20;0;-0;0;0;0;0;3;0;0;0;0;97;2;0;105;50,5;0;100;0;0;13;120;27;-20;28,7;28;24;18;1;1;43,8;45;23,9;12,1;1;1;50,3;50;20;20;1;1;-20;0;20;20;0;1;-20;0;20;20;0;1;-20;0;20;20;0;1;-20;0;20;20;0;1;-20;0;20;20;0;1;21,7;0;76,2;0;-20;0;-20;0;-20;0;0;50;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;73,2;0;93779,2;100;3;3;3;0;1;6;0;0;0;0;0;0;0;0;0;2;0;10;3;0;0;0;50;0;0;49B;1000;7A00;0;0;0;0;200;
29.12.2022 19:52;1;1,2;7,5;69,7;0;66,3;0;0;0;0;0;0;0;0;13;3;75;0;20;10;140;1000;66,1;58;1,2;1,4;72,9;120;63,5;-20;-20;0;-0;0;0;0;0;3;0;0;0;0;97;2;0;105;50,5;0;100;0;0;13;120;27;-20;29,0;28;24;18;1;1;43,5;45;23,9;12,1;1;1;50,0;50;20;20;1;1;-20;0;20;20;0;1;-20;0;20;20;0;1;-20;0;20;20;0;1;-20;0;20;20;0;1;-20;0;20;20;0;1;21,7;0;76,2;0;-20;0;-20;0;-20;0;0;50;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;73,2;0;93779,2;100;3;3;3;0;1;6;0;0;0;0;0;0;0;0;0;2;0;10;3;0;0;0;50;0;0;49F;1000;7D00;0;0;0;0;200;
 
ich hab jetzt einen Ansatz zum Fehler

das script dürfte die Zeilenumbrüche nicht richtig schreiben, das sagt zumindest Grafana beim einlesen

sobald ich die csv mit excel öffne und speichere funktioniert es wieder
 
Ich gehe jetzt einen anderen Weg

ich mach das jetzt mit php, da hab ich die Daten besser im griff. Ich verwende zwar immer noch die csv-Variante aber einer SQL steht auch nichts mehr im weg.

Noch ein Vorteil, WSL ist komplett aus dem Spiel und das php-script wird per Win-Aufgabenplanung alle 2 Minuten ausgeführt
 
ich muss das Thema nochmal rauskramen

Die Daten Abholung und Verarbeitung läuft seit dem letzten Post stabil und zuverlässig. Da die Datenmenge nach einem Jahr doch etwas viel ist bzw. die Datendichte in der grafischen Auswertung sowieso nicht ablesbar ist, möchte ich die Daten ausdünnen.

mit folgenden Kriterien (die ich je nach bedarf ändern kann):
* Daten nur alle 15min behalten (eventuell 30 oder 60min)
* alle Daten die älter als 3 Monate sind ausdünnen
* muss mit PHP laufen da ich es in die bestehende Verarbeitung einbauen möchte

hier die Datenreihe --> https://m-l.at/?l=tNbBic

mein Entwurf den ich vor einiger Zeit getestet habe aber nicht zum laufen bringe

PHP:
<?php
error_reporting(0);

ini_set('memory_limit', '1024M'); // or you could use 1G

// CSV auslesen---------------------------------------------------------------------------------------------------------------------
function csvToArray($csvFile){
    $file_to_read = fopen($csvFile, 'r');
    while (!feof($file_to_read) ) {
        $lines[] = fgetcsv($file_to_read, 1000, ';');
    }
    fclose($file_to_read);
    return $lines;
}
//read the csv file into an array 
$csvFile = 'HK40Log - Kopie.csv';
$csv = csvToArray($csvFile);

//render the array with print_r 
//echo '<pre>';
//print_r($csv[0]);
//echo '</pre>';

$tempfile = 'temp.csv';

$monat = date("d.m.Y", strtotime("-3 month"));

echo "Datum ab dem zur&uuml;ck gesucht wird: " . $monat;

$suchstring = strtotime($monat);

$aarray=array('0', '3'); //Werte die bleiben, 0 = volle Stunde, 3 = halbe Stunde
            
foreach($csv as $subArray){

    $line = $subArray[0] . ' bleibt';
    //$line = 'test';


    $subArray[0] = utf8_decode($subArray[0]);
    $subArray[0] = str_replace('?', '', $subArray[0]);

    $substring = substr($subArray[0], 0, 10);

    $substring = strtotime($substring);
    
    if($substring < $suchstring){
        //echo '<p>' . $subArray[0] . '</p>';
        //echo '<p>' . substr($subArray[0], 14, 2) . '</p>';
        $a = substr($subArray[0], 14, 1);
        if (!in_array($a,$aarray)){ 
            echo '<p>' . $subArray[0] . '</p>';
        }else {
            echo '<p>' . $line . '</p>';

        
            //$file = fopen($tempfile, 'w+');
    
            //fwrite($file, chr(239) . chr(187) . chr(191) . $lines . $temp);
        
        }
        
    }
}

fclose ($file);

?>

Die letzten Zeilen sind nur mal zum weiterarbeiten rein kopiert.
Ich kann die zu entfernenden Datenreihen ermitteln, aber die zu behalten sind nicht.

es reicht schon ein Denkanstoß wo ich mich verrannt habe

Danke

EDIT: ich habe den Code nochmal geändert, im vorherigen war noch nicht alles angepasst
 
Zuletzt bearbeitet:
Zurück