Python 如何从Ruby中的非UTF-8文本文件中提取数字并将其放入另一个文件中?
我有一些数据由终端记录并保存到一个打字脚本文件中。我知道如果需要的话,我可以把它改成.txt。问题似乎是,尽管在请求文件编码时返回UTF-8,但我得到的错误似乎暗示编码是其他东西。例如,我无法将内容复制并粘贴到Word或其他文本编辑器中 不管怎样,我做标准的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∑@
.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;博士
中,而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"))