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
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
oder
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
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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 8018532228
Url: https://administrator.de/contentid/8018532228
Ausgedruckt am: 21.11.2024 um 13:11 Uhr
8 Kommentare
Neuester Kommentar
Moin.
nimm mal
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
Gruß siddius
nimm mal
awk '/[^|]$/ { printf("%s", $0); next } 1' t.csv >t2.csv
Mit SED geht das obige auch
sed -zre 's/[^|]\n//' t.csv > t2.csv
Gruß siddius
Moin Ralf,
machen.
Gruß Thomas
Zitat von @RalfHackmann:
Ich habe versucht die <LF> bzw. \n über sed zu ersetzen
sed & grep arbeiten Zeilenweise, wenn man den Parameter -z nicht angibt.Ich habe versucht die <LF> bzw. \n über sed zu ersetzen
sed 's/\n//g‘ t.csv > t2.csv
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
Gruß Thomas
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 ...
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 ...
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).