2 Stimmen

UNIX-Dateisortierproblem von Java aus

Wir haben ein Java-Programm, bei dem eine Datei während des Prozesses sortiert werden soll. Die betreffende Datei kann jedes druckbare Zeichen enthalten, das über die Tastatur eingegeben werden kann. Wir sind in der Lage, die Sortierung bei einem standardmäßigen einstelligen Begrenzungszeichen OK auszuführen, aber wenn die Sortierung auf dieses Zeichen stößt, wird es falsch geparst. Wir möchten entweder ein Tabulator-Begrenzungszeichen oder ein mehrstelliges Trennzeichen verwenden, damit die Datei unabhängig vom Inhalt der Daten korrekt sortiert wird. Die Befehlszeichenfolge wird dynamisch erstellt und zur Ausführung an die Shell übergeben, wie unten gezeigt.

execStr = new StringBuffer("/usr/bin/sort -n +1n -2 +0n -1 -o " + outputFile.toString() + " -t " + DELIMITER + " " + outputFile.toString()); Process runProc = Runtime.getRuntime().exec (execStr.toString());

Wenn wir das $ und die Häkchen einfügen, um das Trennzeichen zu umschließen, findet die Sortierung nicht die gewünschten Spalten und sortiert nach der ersten Spalte, was uns vor ein Problem stellt, wenn wir das Tabulatorzeichen als $'\t' . Wir haben versucht, Zeichen außerhalb des druckbaren Bereichs zu verwenden, wie z. B. $'Ç' (hex C7), aber der Sortiermechanismus Java String veröffentlicht ein Fragezeichen für das Zeichen wie $'?' was bei uns natürlich nicht funktioniert. Es scheint, dass die Art und Weise, wie Java mit Strings umgeht und wie sortieren Sie zu lesen, macht uns zu schaffen. Ist noch jemand auf dieses Problem gestoßen und wenn ja, wie haben Sie es gelöst? Idealerweise wäre die Verwendung eines mehrstelligen Trennzeichens für uns das Beste, aber wir nehmen das Tabulatorzeichen, wenn wir es zum Laufen bringen können.

Vielen Dank im Voraus, Mike

1voto

Norman Gray Punkte 11293

Sie machen es sich selbst schwer, indem Sie eine bequeme Methode anwenden!

Erstens: Was ist $'\t' ? Das sind vier Zeichen, und es gibt keine Möglichkeit, ein Tabulatorzeichen anzugeben.

Das Wichtigste ist, dass in exec(command) die command String wird mit einem StringTokenizer aufgespalten, der den Befehlsstring an Leerzeichen aufteilt. Zu den Leerzeichen gehört auch das Tabulatorzeichen, das daher verschwindet -- das ist warum die Einfügung eines wörtlichen Tabulatorzeichens nicht funktioniert.

Auch (obwohl dies nicht wirklich etwas mit Ihrem Problem zu tun), Ihre StringBuffer ist redundant, da es mit einer einzigen Zeichenfolge initialisiert wird, die die übliche Weise mit verkettet wird + .

Am besten erstellen Sie den Befehl mit ProcessBuilder (wie in Jackrabbit's Kommentar vorgeschlagen). Auf diese Weise können Sie genau kontrollieren, welche Argumente was sind, und wenn Sie ein wörtliches Tabulatorzeichen als eines der Argumente einschließen, ist es das, was in dem an das Programm übergebenen Argument enthalten sein wird.

ProcessBuilder pb = new ProcessBuilder("/usr/bin/sort", "-t", "\t", ...);

Es ist sehr leicht, den Fehler zu machen, bei so etwas zu vergessen, dass die Shell eine ganze Menge Arbeit mit einem Befehl macht, der in ein Terminal eingegeben wird, und dass Sie keine Shell haben, die diese Art von Escape-Arbeit in einem Kontext wie diesem macht. Die Shell stellt eine Argumentliste zusammen, die aus einem Array von Zeichenketten besteht, und das ist es, was an exec(3) übergeben wird. Um der Vernunft willen wollen Sie die Zwischenschritte so weit wie möglich überspringen und diese Zeichenkette selbst zusammenstellen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X