gpt4 book ai didi

java - 来自 Java 的 UNIX 文件排序问题

转载 作者:行者123 更新时间:2023-11-30 11:48:31 25 4
gpt4 key购买 nike

我们有一个 Java 程序,它需要在进程中对文件进行排序。有问题的文件可能包含键盘上可用的任何可打印字符。我们能够在标准的单字符定界符上执行 OK 排序,但是当排序遇到该字符时,它解析不正确。我们希望使用制表符分隔符或多字符分隔符,以便无论数据内容如何,​​文件都能正确排序。我们正在动态构建命令字符串并将其传递给 shell 以执行,如下所示。

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

如果我们包含 $ 和刻度线来包裹定界符,排序将无法找到所需的列并在第一列上排序,这给我们带来了将制表符指定为 $'\t' 的问题。我们曾尝试使用可打印范围之外的字符,例如 $'Ç'(十六进制 C7),但是 Java 字符串的排序机制为 $'?'< 等字符发布了一个问号,这当然对我们不起作用。 Java 处理字符串的方式以及排序 读取字符串的方式似乎很适合我们。有没有其他人遇到过这个问题,如果遇到过,您是如何解决的?理想情况下,使用多字符定界符对我们来说是最好的,但如果可以的话,我们会使用制表符。

提前致谢,迈克

最佳答案

您使用便捷的方法让自己很难做到这一点!

首先,什么是$'\t' ?那是四个字符,不是指定制表符的任何方式。

关键是要注意 exec(command) , command使用 StringTokenizer 拆分字符串,它将在空白处拆分命令字符串。空格包含您的制表符,因此它会消失 -- 这就是为什么包含文字制表符不起作用。

此外(虽然这与您的问题没有任何关系),您的 StringBuffer 是多余的,因为它是用单个字符串初始化的,该字符串以通常的方式连接 + .

您最好使用 ProcessBuilder 创建命令(正如 jackrabbit 的评论所建议的那样)。这样,您就可以准确控制参数是什么,如果您将文字制表符作为参数之一包含在内,那么传递给程序的参数中也会包含该字符。

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

在做这样的事情时很容易犯错误,忘记了 shell 对终端中键入的命令做了很多工作,而你没有 shell 进行这种转义在这样的环境中工作。 shell 组装一个由字符串数组组成的参数列表,这就是传递给 exec(3) 的内容。为了理智起见,您希望尽可能跳过中介,并自己组装这个字符串。

关于java - 来自 Java 的 UNIX 文件排序问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8763288/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com