Was ist der beste Weg, auf 500k Linie Datei zu tun dos2unix, in Windows? [geschlossen]
-
10-07-2019 - |
Frage
Frage sagt alles, ich habe eine 500.000 Zeilendatei bekommt, die auf einer Windows-Box als Teil eines automatisierten Build-Prozesses erzeugt werden, und es ist gespickt mit ^ M 's. Wenn es die Tür geht es muss * nichts freundlich, was ist der beste Ansatz, hier gibt es einen handlichen Code-Schnipsel, die dies für mich tun könnten? Oder muss ich ein wenig C # oder Java-Anwendung schreiben?
Lösung
Hier ist ein Perl-Einzeiler, genommen von http://www.technocage.com / ~ Caskey / dos2unix /
#!/usr/bin/perl -pi
s/\r\n/\n/;
Sie können es laufen wie folgt:
perl dos2unix.pl < file.dos > file.unix
Sie können aber auch auf diese Weise ausgeführt werden (die Umsetzung in-place getan):
perl -pi dos2unix.pl file.dos
Und hier ist meine (naive) C-Version:
#include <stdio.h>
int main(void)
{
int c;
while( (c = fgetc(stdin)) != EOF )
if(c != '\r')
fputc(c, stdout);
return 0;
}
Sie sollten es mit Ein- und Ausgabeumleitung ausführen:
dos2unix.exe < file.dos > file.unix
Andere Tipps
Wenn eine Basis Installation Cygwin zu schwer ist, gibt es eine Reihe von eigenständigen dos2unix
und unix2dos
eigenständigen Windows-Konsole -basierte Programme im Netz, viele davon mit C / C ++ Quelle zur Verfügung. Wenn ich die Anforderung richtig bin Verständnis, eine dieser beiden Lösungen würde gut in einen automatisierten Build-Skript passen.
Wenn Sie unter Windows sind und etwas brauchen in einer Batch-Skript ausführen, können Sie ein einfaches C-Programm kompilieren, den Trick zu tun.
#include <stdio.h>
int main() {
while(1) {
int c = fgetc(stdin);
if(c == EOF)
break;
if(c == '\r')
continue;
fputc(c, stdout);
}
return 0;
}
Verbrauch:
myprogram.exe < input > output
Bearbeiten an Ort und Stelle wäre ein bisschen schwieriger. Außerdem aus irgendeinem Grund können Sie Backups der Originale halten (falls Sie versehentlich eine Binärdatei Streifen, zum Beispiel).
Diese Version entfernt alle CR-Zeichen; wenn Sie nur die, die entfernt werden sollen, die in einem CR-LF Paaren sind, können Sie verwenden (dies ist die klassische Ein-Zeichen-back-Methode: -):
/* XXX Contains a bug -- see comments XXX */
#include <stdio.h>
int main() {
int lastc = EOF;
int c;
while ((c = fgetc(stdin)) != EOF) {
if ((lastc != '\r') || (c != '\n')) {
fputc (lastc, stdout);
}
lastc = c;
}
fputc (lastc, stdout);
return 0;
}
Sie können die Datei an Ort und Stelle unter Verwendung von Modus „r +“ bearbeiten. Im Folgenden finden Sie ein allgemeines myd2u Programm, das Dateiname als Argument akzeptiert. Hinweis: Dieses Programm verwendet ftruncate am Ende zusätzliche Zeichen abzuzuhacken. Wenn es eine bessere (Standard) Art und Weise, dies zu tun, bearbeiten Sie oder kommentieren. Dank!
#include <stdio.h>
int main(int argc, char **argv) {
FILE *file;
if(argc < 2) {
fprintf(stderr, "Usage: myd2u <files>\n");
return 1;
}
file = fopen(argv[1], "rb+");
if(!file) {
perror("");
return 2;
}
long readPos = 0, writePos = 0;
int lastC = EOF;
while(1) {
fseek(file, readPos, SEEK_SET);
int c = fgetc(file);
readPos = ftell(file); /* For good measure. */
if(c == EOF)
break;
if(c == '\n' && lastC == '\r') {
/* Move back so we override the \r with the \n. */
--writePos;
}
fseek(file, writePos, SEEK_SET);
fputc(c, file);
writePos = ftell(file);
lastC = c;
}
ftruncate(fileno(file), writePos); /* Not in C89/C99/ANSI! */
fclose(file);
/* 'cus I'm too lazy to make a loop. */
if(argc > 2)
main(argc - 1, argv - 1);
return 0;
}
tr -d '^M' < infile > outfile
Sie geben ^ M als: Strg + V, Enter
Bearbeiten : Sie können '\ r' anstelle von manuell einen Wagenrücklauf eingeben, [ dank @strager ]
tr -d '\r' < infile > outfile
Edit 2 : 'tr' ist ein Unix-Dienstprogramm können Sie eine native Windows-Version von herunterladen http://unxutils.sourceforge.net [ dank @ Rob Kennedy ] oder verwenden Sie cygwin 's Unix-Emulation.
FTP- es von der DOS-Box, auf den Unix-Rechner, als ASCII-Datei anstelle einer Binärdatei. Ftp die Streifen crlf , und fügen Sie ein lf . Bringen Sie es zurück in die DOS-Box als Binärdatei, und die lf wird beibehalten.
Einige Texteditoren, wie UltraEdit / UEStudio diese Funktionalität eingebaut.
File > Conversions > DOS to UNIX
Wenn es nur eine Datei, die ich Notepad ++ verwenden. Schön, denn es ist kostenlos. Ich habe Cygwin einen Einzeiler Skript installiert und verwende ich für mehrere Dateien geschrieben. Wenn Ihr Interesse an dem Skript einen Kommentar abzugeben. (Ich habe es mir nicht verfügbar einer diesen Moment.)