【问题标题】:Fill remainder of line with spaces to hit fixed width用空格填充行的其余部分以达到固定宽度
【发布时间】:2015-11-05 21:29:58
【问题描述】:

我有一些应该是固定宽度和空格分隔的纯文本数据文件。但是,最右侧的列很少被填充,对于那些缺少值的行,该行的文本会在最后一个填充的列处停止。由于字符停止,文件的宽度并不是真正固定的,也没有任何分隔符或缺失符号 (NA)。

当我检查标题时,我发现最大的行结构是

  • 17 列,16 个空格

  • 77 char 表示数据的固定宽度为 93,包括分隔符

  • (4,2,2,2,2,5,5,3,8,5,7,4,4,6,6,6,6)的列结构

    李>

我想做的是在每行的末尾添加 93-POPULATED_LENGTH 个空格,以便我可以将其解析为固定宽度以进行数据分析。 Bash 或轻量级 Python 中的解决方案将是理想的。

【问题讨论】:

  • 请在您的问题中添加示例输入和该示例输入所需的输出。
  • SO 不是代码编写服务。请展示你的尝试。
  • 执行此操作的 Bash 可能比告诉我离开的帖子要短。
  • 对不起,我从来没有打算送你走。我已经解释了 SO 不是什么。请阅读thisthis。顺便说一句,看看我的答案。

标签: python r string bash text-parsing


【解决方案1】:

使用 Python,应该这样做

MAXCOLS = 93
with open('words.txt') as in_f, open('outfile.txt', 'w') as out_f:
    for line in in_f:
        line = line.rstrip()
        l = len(line)
        padline = MAXCOLS-l
        out_line = line+' '*padline+'\n'
        out_f.write(out_line)

例如,给定 21 列的较小固定宽度并使用“X”标记空格

输入文件为

ciao come va
oggi meglio di domani
ieri peggio di oggi
my puzzle is big
yours puzzle is small

它产生一个输出文件

ciao come vaXXXXXXXXX
oggi meglio di domani
ieri peggio di oggiXX
my puzzle is bigXXXXX
yours puzzle is small

【讨论】:

    【解决方案2】:

    我建议使用 tr 实用程序将您的文件转换为 csv。它可以用逗号替换空格:

    echo 'adam jane sam' > names.txt
    cat names.txt | tr -s ' ' ','
    adam,jane,sam
    

    尾随空格将变成一个逗号,后面没有任何内容,R 和 pandas 都会将其读取为 NA/NaN。

    【讨论】:

      【解决方案3】:

      $ awk '{printf("%-93s\n", $0) }' file.txt > file2.txt

      这完成了工作,但不知道为什么。 AWK 和 SED 像往常一样提供它们的黑魔法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-25
        • 1970-01-01
        • 1970-01-01
        • 2011-05-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多