2011-03-22 126 views
0

我正在处理大型CSV。我怎样才能随机抽取一行记录 - 比如说总共200行 - 并将它们重新组合为一个与原始结构相同的CSV文件?从CSV采样随机行

+0

你指的是哪种语言? – Premraj 2011-03-22 14:29:36

+0

我们谈论的CSV有多大?大到几MB,或者大到几GB? – SWeko 2011-03-22 14:31:10

+0

它需要的随机程度如何? – 2011-03-22 14:45:51

回答

1

我想使用的程序如下:

  1. 生成和0之间200个唯一编号在CSV文件的行数。
  2. 阅读CSV文件的每一行,并记录您正在阅读的行号。如果其行号与上述数字中的一个匹配,则输出它。
1

使用Resevoir Sampling随机抽样技术,不要求所有记录在内存中或实际记录的数量是已知的。有了它,您可以一个接一个地记录您的记录,并将它们概率性地选入样本。一旦流被用尽,输出最终的样本记录。该技术保证流中的每个记录与最终样本中的相同概率。也就是说,它会生成一个简单的随机样本。

0

您可以使用随机模块的random.sample方法随机化线偏移列表,如下所示。

import random 

# Fetching line offsets. 
# Courtesy: Adam Rosenfield's tip about how to read a HUGE text file. 
# http://stackoverflow.com/questions/620367/ 

# Read in the file once and build a list of line offsets 
line_offset = [] 
offset = 0 
for line in file: 
    line_offset.append(offset) 
    offset += len(line) 
file.seek(0) 

# Part where you pick the random lines and copy to your new file 
# My 2 cents. 
randoffsets = random.sample(line_offset, 200) 

with open('your_file') as f: 
     for k in randoffsets: 
    f.seek(k) 
    f.readline() # and append to your new file 

你可以尝试使用linecache它是否适合你,但因为linecache将整个文件读取到内存中,我不知道它会如何为6GB的文件工作。