从tsv文件中过滤唯一值

时间:2018-07-12 18:16:40

标签: ruby csv

我有一个包含四列的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

2 个答案:

答案 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"]
相关问题