【问题标题】:Issue with split field parsing拆分字段解析的问题
【发布时间】:2014-04-24 12:11:59
【问题描述】:

我正在逐行读取一个 txt 文件。列通过“;”分隔分隔符,文件与下面的类似。

text;10.1.1.1;description
text;10.1.1.2;description
...
text;10.1.1.90;description

Perl 代码:

@splitted=split(";",$line)
$description=$splitted[2];

阅读最后一个字段(描述)时,我遇到了一个奇怪的情况。 此字段未正确读取,我可以在进行文本比较时看到问题,但在打印 $description 时更明显

如果我

print ":$description:" 

(我使用 : 作为分隔符来查看字符串前后是否有空格),我可以看到实际的字符串甚至会占用引号或该短语之前的任何字符串:

字面意思:

代替:

"The value of description is :abcdef:" 

我明白了

"The value of descripabcdef"

通过在行尾添加一个分隔符来解决问题:IE:

text;10.1.1.1;description;
text;10.1.1.2;description;
...
text;10.1.1.90;description;

我希望我能够清楚地说明这一点。 非常感谢, 弗朗切斯科

【问题讨论】:

    标签: perl parsing text


    【解决方案1】:

    看起来文件是在 Mac 上创建的,并且行尾字符是单个 \r

    您可能没有删除它(Perl 中的chomp)。发生的情况是输出已完成,但嵌入的 \r 导致后面的文本覆盖早期的输出。

    另一种可能性是该文件是在 Windows 上创建的(行尾为 \r\n),而您正在一个行尾仅为 \n 的系统上处理此文件。在这种情况下,chomp 将删除 \n,但将 \r 留在行尾。

    您应该在拆分之前从行中删除所有尾随空格。 IE。

    s/\s+$//
    

    【讨论】:

    • 谢谢吉姆,我确实在 eniter 行和单/字符串上都使用了 chomp。没有任何改变。
    • 是的,它确实有效。伟大的直觉。所以这个 Reg Ex 是在行尾处理一个或多个空格(s+),对吧?再次感谢。
    • 是的,没错,将匹配的字符串替换为空。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-23
    相关资源
    最近更新 更多