2011-03-22 130 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的文件工作。