我有一个包含四列的tsv文件。我很难隔离文件的第一列(UUID),因此可以从每个元素中删除'UUID =',还可以从唯一值中进行过滤。
我的代码在做什么错?我一直很想解决这个问题。预先谢谢你!
这是文件的链接,以及下面的代码。
https://drive.google.com/file/d/1mGaK3n3YCrzrwOgSo5QQZ62FXDKJ3nZ8/view?usp=sharing
require "csv"
log_file = CSV.foreach("output_file.tsv",{:col_sep => "\t", :headers => true}) do |row|
uuid = row["UUID"]
ip = row["IP"]
time = row["TIME"]
ua = row["UA"]
uuid = uuid.drop(1)
ip = ip.drop(1)
time = time.drop(1)
ua = ua.drop(1)
uuid = uuid.map { |element|
element = element[5..-1]}
unique_logins = uuid.uniq
puts uuid.uniq.length
答案 0 :(得分:1)
可能您有点困惑,认为CSV.foreach
会读取整列,但实际上是逐行读取文件。这就是为什么不需要drop(1)
。
这是最小的代码,该代码从文件中收集uuid,并打印这些uuid的数量,然后打印唯一uuid的数量
require "csv"
uuids = []
log_file = CSV.foreach("output_file.tsv",{:col_sep => "\t", :headers => true}) do |row|
uuids << row["UUID"]
end
uuids = uuids.map { |element| element = element[5..-1]}
p uuids.length
unique_logins = uuids.uniq
p unique_logins.length
答案 1 :(得分:0)
如果文件不是那么大,您也可以一次读取整个文件,然后使用返回的CSV::Table
读出整个列并对其进行操作:
require 'csv'
tsv = CSV.read("output_file.tsv", col_sep: "\t", headers: true)
uuids = tsv['UUID'].map { |uuid| uuid[/\AUUID=(.+)\z/, 1] }.uniq
# => ["e9fc3b6e6641e69fb8cfbdfac48709ae", "f296020354e8c913454f62732d0e3dc4",
# "0300481b1e495e3c919b5214dda7b26c", "9ccc4096ed1d11d1b4c9e57ca1192176",
# "c0580eeb3f98d9c3fe232fc48694bf8e", "25ee63a754b9d4590b69b9ab2a4668cd",
# "aa61387f01797a839ca6f55daeb69b30", "9c7f37f5c187f662eaf7d0df83ac8804"]