Python 如何从Ruby中的非UTF-8文本文件中提取数字并将其放入另一个文件中?

Python 如何从Ruby中的非UTF-8文本文件中提取数字并将其放入另一个文件中?,python,ruby,regex,excel,terminal,Python,Ruby,Regex,Excel,Terminal,我有一些数据由终端记录并保存到一个打字脚本文件中。我知道如果需要的话,我可以把它改成.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∑@

我有一些数据由终端记录并保存到一个打字脚本文件中。我知道如果需要的话,我可以把它改成.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工作表的第1列或第3列(无限期,直到我在终端中终止程序)的最佳方式是什么

生成输入文件的Python程序只需从串行对象获取值并将其输出到终端,终端将生成所讨论的文本文件。我只是徒劳地试图将它们从这个文本文件手动移动到Excel(我现在愚蠢地试图用一个简单的
Ruby
脚本将这项任务自动化)

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

我有一台Mac电脑,所以我使用页面,如果这有区别的话

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

TL;博士

  • 如何在新的一行(每个数字的长度为1-3位)上仅打印typescript(似乎非UTF-8)文件中的数字

  • 如何使整个过程自动化,并让Python程序无限期地(在一个无限的
    中,而True:
    循环)将值插入
    .numbers
    (Excel for Mac)文件中


  • 谢谢大家!

    Regex:或
    (?你真的应该把这个问题分成两个独立的问题。下面是第一个问题的答案;一些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"))
    

    感谢您的回答。最终对我有效的解决方案是获取二进制文件并通过以下脚本运行它:

    strings input.txt | grep-o“\d.*”| uniq>output.txt


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

    这似乎对其他txt文件有效,但不是我尝试使用的文件!我收到以下错误:dataprocessor.rb:1:in`===':UTF-8中的字节序列无效(ArgumentError)但是当我请求文件的编码时,它显示为UTF-8。发生了什么事?UTF-8是默认编码,因此即使内容不是有效的UTF-8,文件也将以UTF-8编码模式打开。看起来该文件根本不是文本文件,而是二进制文件。因此,无法可靠地调用
    读线
    ,因为这样会以文本模式而不是二进制模式打开文件。此数据文件是如何创建的?有一个Unix实用程序,
    strings
    ,它可以扫描一个文件,该文件可以是二进制文件,并输出它找到的字符串。您可以使用该工具,甚至可以使用系统的
    grep
    ,以加快操作速度并减少内存消耗:
    strings-input.txt
    或使用grep,
    strings-input.txt | grep“^attr\d”
    (如果不进一步研究,我不知道命令行上最好的正则表达式。)您需要对传递到命令行的带引号的字符串使用Shellwords.escape,首先执行
    require Shellwords
    Shellwords
    在上面的注释中应该包含引号,所以它应该是
    require'Shellwords'
    。我使用了bash命令“script-r”,以录制终端会话。它自动生成此文件。非常感谢您提供的所有有用信息!您刚刚为我节省了大量的工作。
    ['11', '0', '99', '120', '0']
    
    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"))