如何每组仅保留CSV文件中的100个最新条目

时间:2018-04-14 03:44:34

标签: javascript python csv

我有一个应用程序,我需要测量每个设备的基于时间戳的参数值。信息结构严密,我没有查看数据库的原因是因为我必须每隔几分钟获得100 x 1000 = 100k行的所有数据。我想删除与每个组中最早的时间戳对应的数据。我正在使用Python进行编程,但即使是JavaScript也可以。我在Python CSV官方模块中找不到limit参数。非常感谢帮助。

Item 1
Timestamp, parameter1, parameter2...parameterN
...
100 rows
Item 2
Timestamp, parameter1, parameter2...parameterN
...
100 rows
...1000 items

注意:没有用于分隔任何行的标题,显示项目1,2等用于表示目的。

我需要能够在每个组下每隔几分钟添加一个新行,并有效地删除旧行,有效地保持每组100个数字

3 个答案:

答案 0 :(得分:1)

没有limit参数,因为读者只是一个迭代器,Python有通用的方法可以做任何你想对任何迭代器做的事情。

with open(path) as f:
    r = csv.reader(f)

前100:

itertools.islice(r, 100)

最后100:

collections.deque(r, maxlen=100)

第3栏最多100个:

heapq.nlargest(100, r, key=operator.itemgetter(2))

......等等。

答案 1 :(得分:1)

像这样在内部存储您的数据

dict [key] [timestamp] [值数组]

data={}

if 'bob' in data:
    data['bob']={}
    data['bob'][timestamp]=list(values)
else:
    data['bob'][new_timestamp]=list(values)

经过2次迭代后,您的数据数组将显示为

data['bob'][15000021][1,2,3,4,5]
data['bob'][15003621][5,6,7,8,9,0]

如果您想要最新的...只需获取bob的唯一键 - 并删除

- either anything more than n items (bob's values sorted by timestamp)
- or if the timestamp is less than now() - 2 days [or whatever your rule]

我在类似的数据集中使用这两种机制。我强烈建议您保存这些数据,以防您的流程存在。

如果您的数据包含OrderedDictionary(这将使删除更容易) - 请不要pickle将失败,但优秀的模块 dill (我不是开玩笑)非常好,并处理所有数据类型和关闭更好的恕我直言。

答案 2 :(得分:1)

**从评论**移动

我假设从下往上阅读文件可以帮助你...这可以通过将条目添加到文件开头来完成。

有了这个假设,你只需要在每个条目上重写文件。将新文件读入数组,push()新条目shift()列表并写入新文件。

或者,您可以继续push()到该文件,只读取前100个条目。在您阅读之后,如果您希望在读取之间始终获得超过100个条目,则可以删除该文件并启动一个新文件,或者您可以将文件清理为仅100个条目