ralfhackmann
Goto Top

Unerwünschte LF aus CSV-Datei entfernen

Hallo,

wir setzen ein ERP-System mit einer Informix SE Datenbank, auf einem Linux Server ein, das über Windows Clients bedient wird.

Bei der Pflege von Textfeldern haben die User, wahrscheinlich durch C&P, Sonderzeichen bzw. <CR><LF> eingefügt.
Beim UNLOAD der Daten in eine CSV-Datei wird an der Stelle ein <LF> gesetzt, was beim späteren Import in eine externe Applikation zu Problemen führt.

Hier ein Beispiel:

t.csv
lffehler

Die Zeilen 49182 und 49185 sind korrekt. Inder Zeile 49183 befindet sich das unerwünschte <LF>, das die zusätzliche Zeile 49184 erzeugt.


Ich habe versucht die <LF> bzw. \n über sed zu ersetzen

sed 's/\n//‘ t.csv > t2.csv   

oder

sed 's/\n//g‘ t.csv > t2.csv   

haben nichts verändert.

Wobei, wenn die <LF> gelöscht worden wären, doch dann auch die erforderlichen an jedem Zeilenende?

Hat jemand eine Idee, wie ich mein Problem lösen kann?

Gruß

Ralf

Content-ID: 8018532228

Url: https://administrator.de/contentid/8018532228

Ausgedruckt am: 21.11.2024 um 13:11 Uhr

7907292512
7907292512 01.08.2023 aktualisiert um 10:39:49 Uhr
Goto Top
Moin.
nimm mal
awk '/[^|]$/ { printf("%s", $0); next } 1' t.csv >t2.csv  
Wobei ich hierbei davon ausgehe das in korrekten Zeilen am Ende ein "|" vor dem Linefeed steht. Ist das dann bei unkorrekte Zeilen nicht der Fall dann wird die entsprechende Zeile ohne Linefeed ausgeben und die nächste Zeile direkt angehangen.

Mit SED geht das obige auch
sed -zre 's/[^|]\n//' t.csv > t2.csv  

Gruß siddius
TK1987
TK1987 01.08.2023 aktualisiert um 10:29:52 Uhr
Goto Top
Moin Ralf,

Zitat von @RalfHackmann:
Ich habe versucht die <LF> bzw. \n über sed zu ersetzen
sed 's/\n//g‘ t.csv > t2.csv  
sed & grep arbeiten Zeilenweise, wenn man den Parameter -z nicht angibt.

Inder Zeile 49183 befindet sich das unerwünschte <LF>, das die zusätzliche Zeile 49184 erzeugt.
steht in diesen Zeilen immer ein Backslash vor dem Linefeed? Dann könnte man natürlich direkt:
sed -z 's/\\\n//g' t.csv > t2.csv  
machen.

Gruß Thomas
Crusher79
Crusher79 01.08.2023 aktualisiert um 11:48:39 Uhr
Goto Top
Hallo,

hier ist das ganze als procedure erklärt:

https://stackoverflow.com/questions/55874741/how-to-prevent-line-breaks- ...

Welche Version setzt ihr denn dein? Windows Client ist dann Genero?

Würde das oben erwähnte ggf. in die procedure packen und damit schon dne output direkt sauber erstellen.

Alternativ ginge noch ODBC und clientseitig. Crystal Reports benötigt bei uns noch ODBC Verbindung. Je nach länge ist es aber wohl über den Server schneller zu realisieren.

Einige Statements sind Versionabhänging. Nicht immer wird ja die aktuelle Version von ERP eingesetzt. Was ist denn eig. euer OS? OpenSUSE?

mfg Crusher

PS:
https://stackoverflow.com/questions/43075313/how-to-ignore-or-replace-ca ...

Hier werden die auf Basis des ASCII Codes rausgefiltert.


REPLACE
https://www.ibm.com/docs/en/informix-servers/12.10?topic=smf-replace-fun ...
RalfHackmann
RalfHackmann 01.08.2023 um 12:40:52 Uhr
Goto Top
Hallo,

alle Vorschläge von TK1987 und Siddius funktionieren,

wobei der

sed -z 's/\\\n//g' t.csv > t2.csv  

noch den Backslash entfernt, der an der Stelle nicht in den Daten vorkommt.

Mich würde noch interessieren, warum meine sed ohne -z nicht funktioniert haben.
Bewirkt -z, dass <LF> ignoriert wird?

Ich wollte mir noch die betroffenen Zeilen mit

grep -z '\\n' t.csv  

ausgeben.

bekomm aber kein Ergebnis. Warum?

Gruß

Ralf
RalfHackmann
RalfHackmann 01.08.2023 um 12:56:03 Uhr
Goto Top
Zitat von @Crusher79:

Welche Version setzt ihr denn dein? Windows Client ist dann Genero?
Die Datenbank ist eine Informix SE 7.25.
Der Client ist dann dbaccess, das dirkt im shellscript aufgerufen wird

Würde das oben erwähnte ggf. in die procedure packen und damit schon dne output direkt sauber erstellen.
Es wurden schon einige Modifikationen per sed im Script gemacht, das war der letzte Punkt, der noch nicht funktionierte

Alternativ ginge noch ODBC und clientseitig. Crystal Reports benötigt bei uns noch ODBC Verbindung. Je nach länge ist es aber wohl über den Server schneller zu realisieren.

Einige Statements sind Versionabhänging. Nicht immer wird ja die aktuelle Version von ERP eingesetzt. Was ist denn eig. euer OS? OpenSUSE?
Das ganze läuft auf Ubuntu Server
Das ERP ist auf Basis von cdix und Microfocus Cobol

Gruß

Ralf
Crusher79
Crusher79 01.08.2023 um 13:02:56 Uhr
Goto Top
Und Select Replace geht da nicht? Oder kommst an die Query nicht ran?
RalfHackmann
RalfHackmann 01.08.2023 um 13:20:11 Uhr
Goto Top
Zitat von @Crusher79:

Und Select Replace geht da nicht? Oder kommst an die Query nicht ran?

Hab ich jetzt noch nicht ausprobiert, denn es war mir wichtig, dass der externe Anbieter erst mal saubere daten bekommt.
Das schau ich mir als nächstes an, denn das ist die sauberere Lösung, weil damit direkt die Daten bereinigt würden.
7907292512
7907292512 01.08.2023 aktualisiert um 13:48:22 Uhr
Goto Top
bekomm aber kein Ergebnis. Warum?
grep benutzt im Suchterm per Default Regular Expressions Syntax da sind Backslashes besondere Zeichen die ebenfalls zu escapen sind wenn man sie literal matchen möchte. Zeilenenden mit einem Backslash davor findest dann so: das Dollarzeichen ($) bedeutet Zeilenende in Regular-Expression Syntax.
grep '\\$' t.csv  

sed selbst benutzt zeilenbasiertes Processing wie oben schon genannt wurde, bei dem Zeile für Zeile eingelesen wird und per Default das Zeilenende entfernt wird bevor die User-Commands darauf ausgeführt werden, diese sehen also kein \n, dieses wird erst wieder nach dem Command hinzugefügt und die Zeile ausgegeben:

https://www.gnu.org/software/sed/manual/sed.html#Execution-Cycle
6.1 How sed Works

sed maintains two data buffers: the active pattern space, and the auxiliary hold space. Both are initially empty.

sed operates by performing the following cycle on each line of input: first, sed reads one line from the input stream, removes any trailing newline, and places it in the pattern space. Then commands are executed; each command can have an address associated to it: addresses are a kind of condition code, and a command is only executed if the condition is verified before the command is to be executed.

When the end of the script is reached, unless the -n option is in use, the contents of pattern space are printed out to the output stream, adding back the trailing newline if it was removed.8 Then the next cycle starts for the next input line.

Unless special commands (like ‘D’) are used, the pattern space is deleted between two cycles. The hold space, on the other hand, keeps its data between cycles (see commands ‘h’, ‘H’, ‘x’, ‘g’, ‘G’ to move data between both buffers).