如何使用Python或R高效地从海量CSV中提取唯一行

如何使用Python或R高效地从海量CSV中提取唯一行,python,csv,Python,Csv,我有一个巨大的CSV 1.4gb,超过1MM行的股票市场数据,我将使用R 这张桌子大致像这样。对于每个股票代码,都有数千行数据 +--------+------+-------+------+------+ | Ticker | Open | Close | High | Low | +--------+------+-------+------+------+ | A | 121 | 121 | 212 | 2434 | | A | 32 | 23 |

我有一个巨大的CSV 1.4gb,超过1MM行的股票市场数据,我将使用R

这张桌子大致像这样。对于每个股票代码,都有数千行数据

+--------+------+-------+------+------+
| Ticker | Open | Close | High | Low  |
+--------+------+-------+------+------+
| A      |  121 |   121 |  212 | 2434 |
| A      |   32 |    23 |   43 |  344 |
| A      |  121 |   121 |  212 | 2434 |
| A      |   32 |    23 |   43 |  344 |
| A      |  121 |   121 |  212 | 2434 |
| B      |   32 |    23 |   43 |  344 |
+--------+------+-------+------+------+
为了简化处理和测试,我使用本问题中提到的脚本将这个庞然大物分解成更小的文件:

该脚本将输出诸如data_a.csv、data_b.csv等文件

但是,我还想创建index.csv,它只列出所有唯一的股票代码名称

例如


在处理大型文件时,有谁能推荐一种在R或Python中执行此操作的有效方法吗?

您可以从文件名中检索索引:

(index <- data.frame(Ticker = toupper(gsub("^.*_(.*)\\.csv",
                                           "\\1",
                                           list.files()))))
##   Ticker
## 1      A
## 2      B

write.csv(index, "index.csv")

您可以循环遍历每个文件,获取每个文件的索引,并创建一组所有索引的并集

import glob

tickers = set()
for csvfile in glob.glob('*.csv'):
    data = pd.read_csv(csvfile, index_col=0, header=None)  # or True, however your data is set up
    tickers.update(data.index.tolist())

pd.Series(list(tickers)).to_csv('index.csv', index=False)

假设R可以加载整个文件,那么文件大小并不是真正的大问题,而是如何回答问题。如果行确实是按ticker分组的,那么这就无关紧要了。创建一个csv.Reader和一个csv.Writer,然后为Reader中的行创建:如果行[0]!=最后提示:writer.writerowrow;最后一行代码=第[0]行。就是这样。在写入index.csv之前,您是否要创建输出文件data_a.csv、data_b.csv?如果是这样,您可以迭代文件输出名称并将其写入index.csv。这里没什么复杂的。@serk我能做的,是的。真是个笨蛋,我都没想到。Palm faces Self我推荐dask.dataframe作为内存不足的解决方案。
import glob

tickers = set()
for csvfile in glob.glob('*.csv'):
    data = pd.read_csv(csvfile, index_col=0, header=None)  # or True, however your data is set up
    tickers.update(data.index.tolist())

pd.Series(list(tickers)).to_csv('index.csv', index=False)