【问题标题】:How to extract numbers from a non-UTF-8 text file in Ruby and put them into another file?如何从 Ruby 中的非 UTF-8 文本文件中提取数字并将它们放入另一个文件中?
【发布时间】:2023-04-04 13:00:01
【问题描述】:

我有一些数据由终端记录并保存到打字稿文件中。我知道如果需要,我可以将其更改为 .txt。问题似乎是,尽管在要求文件编码时返回 UTF-8,但我得到的错误似乎暗示编码是别的东西。例如,我无法将内容复制并粘贴到 Word 或其他文本编辑器中。

无论如何,我没有运气使用标准的 .gsub!.tr 方法从该文件中删除非数字字符。

输入看起来像这样:

_4ÑZŸs_4ÑZâ7o[?1034h
_4ÑZ8obash-3.2$ e4ÑZ”C
i[A e4ÑZõD
oscript -re4ÑZˇ?
i[Ae4ÑZ∑@
opython go.pyf4ÑZÌ
i
f4ÑZ£Ì
o
f4ÑZÊÚoattn 0
f4ÑZ,Ûoattn 0
attn 0
Hf4ÑZuÛoattn 0
attn 0
attn 0
attn 0
attn 0
attn 0
attn 0

其中“0”可以是 0 到 128 之间的任何数字。

我只想要单词“attn”之后的数字,而不是 attn。

这是我当前的代码:

File.open("input.txt").each do |line|
  number = line.gsub('[0-9]+', ' ')
  File.open("output.txt", "w+") { |f| f.write(number)  }
end

根据我所做的任何小改动,我要么得到一个枚举器,要么只得到输入文件的最后一个数字。

从没想过做这么基本的事情会这么难。

加分:让程序输出这些数字以将它们插入到 Excel 工作表的第一列或第三列中的最佳方法是什么(无限期地,直到我在终端中终止程序)?

生成输入文件的 Python 程序只是从 Serial 对象中获取值并将它们输出到终端,终端会生成相关的文本文件。我只是试图将它们从这个文本文件手动移动到 Excel 中(我现在愚蠢地尝试使用简单的 Ruby 脚本自动执行一项任务)。

Python 或 Ruby 中的脚本就足够了,只要它需要一个 .txt 文件作为输入(因为我正在处理已经生成的数据)。

我有一台 Mac,所以我使用 Pages,如果这有什么不同的话。

Here 是有问题的原始文件。编辑:出于安全原因删除文件。

TL;DR

  1. 如何仅在新行上打印打字稿(看似非 UTF-8)文件中的数字(每个数字的长度为 1-3 位)?

  2. 如何自动化整个过程,让我的 Python 程序无限期地(在无限 while True: 循环内)将值插入到 .numbers(Mac 版 Excel)文件中?

    李>

谢谢!

【问题讨论】:

    标签: python ruby regex excel terminal


    【解决方案1】:

    正则表达式(?<=^attn\s)(?:[0-9]{1,2}|1[01][0-9]|12[0-8])$(?<=^attn\s)\d+

    详情:

    • (?<=) 积极的向后看
    • \s 匹配任何空白字符(等于[\r\n\t\f\v ]
    • (?:)非捕获组
    • [] 匹配列表中存在的单个字符
    • {n,m} 匹配 nm
    • |或者

    Python 代码

    text = open(r'C:\text.txt').read()
    matches = re.findall(r'(?<=^attn\s)(?:[0-9]{1,2}|1[01][0-9]|12[0-8])$', text, re.M)
    

    输出:

    ['11', '0', '99', '120', '0']
    

    Code demo

    【讨论】:

      【解决方案2】:

      你真的应该把这个问题分成两个单独的问题。这是第一个的答案;一些应该做你想做的事情的 Ruby 代码:

      numbers = File.readlines('input.txt').grep(/^attr \d+/).map do |line|
        line.split('attr ').last.chomp.to_i
      end
      
      File.write('output.txt', numbers.join("\n"))
      

      【讨论】:

      • 这似乎适用于其他 txt 文件,但不适用于我尝试使用的文件!我收到此错误:dataprocessor.rb:1:in `===': invalid byte sequence in UTF-8 (ArgumentError) 但是当我请求文件的编码时,它以 UTF-8 出现。怎么回事?
      • UTF-8 是默认编码,因此即使内容不是有效的 UTF-8,文件也会以 UTF-8 编码模式打开。看起来该文件根本不是文本文件,而是二进制文件。因此,不可能可靠地调用readlines,因为这会以文本模式而不是二进制模式打开文件。这个数据文件是如何创建的?
      • 有一个 Unix 实用程序,strings,它扫描一个文件,可以是二进制文件,并输出它找到的字符串。您可以使用它,甚至使用系统的grep,以加快您的操作并减少内存消耗:strings input.txt 或使用 grep,strings input.txt | grep "^attr \d"。 (如果不进行更多研究,我不知道命令行上最好的正则表达式。)您需要使用 Shellwords.escape 将带引号的字符串传递给命令行,首先执行require shellwords
      • shellwords 在上面的评论中应该包含引号,所以它应该是require 'shellwords'
      • 我使用 bash 命令“script -r”来记录终端会话。它自动生成了这个文件。非常感谢您提供所有这些有用的信息!你刚刚为我节省了大量的工作。
      【解决方案3】:

      感谢您的回答。最终为我工作的解决方案是获取二进制文件并通过此脚本运行它:

      strings input.txt | grep -o "\d.*" | uniq &gt; output.txt

      如前所述,它使用 Unix 命令 strings 仅从二进制文件生成字符串,然后运行 ​​grep 命令仅输出每个数字的唯一实例(未排序,因为它是基于时间的数据) 到输出文件。然后我只是使用 Excel 进行进一步过滤。

      【讨论】:

        猜你喜欢
        • 2014-03-06
        • 1970-01-01
        • 1970-01-01
        • 2016-04-16
        • 1970-01-01
        • 1970-01-01
        • 2017-04-04
        • 2012-07-10
        • 1970-01-01
        相关资源
        最近更新 更多