将 csv 文件数据导入 influxdb

importing csv file data into influxdb

是否可以将 csv 文件数据推送到 influxdb。例如,我有一个传感器设备,每分钟都会将数据更新为 csv 文件。我需要对其进行一些操作。 我需要将 csv 文件数据推送到 influxdb,为此我正在编写一个 python 脚本。 我试图找到一些例子,但没有成功找到任何例子。在我的 python 脚本下面只有读取 csv 文件的代码,这很简单,但没有代码如何将这个 csv 传递给 influx db。我正在尝试的 csv 文件和代码如下所示。

DATE,value
2017-03-23 11:50:38,16
2017-03-23 11:50:44,83
2017-03-23 11:50:50,16
2017-03-23 11:50:56,70
2017-03-23 11:51:02,96

代码是

import datetime
import random
import time
import os
import csv
from csv import reader
import argparse
from influxdb import client as influxdb


db = influxdb.InfluxDBClient(host, 8086, rob, xxxx, sensors_data)


def read_data(filename):
    with open(filename) as f:
        reader = f.readlines()[1:]
        for line in reader:
            print line


if __name__ == '__main__':
    filename = '/home/rob/myfile.csv'
    a = read_data(filename)

我找到了这个 link 但它不同,不符合我的要求。 http://coendegroot.com/grafana-influxdb-and-python-simple-sample/ 我可以读取这个 csv 文件,现在我需要将 csv 文件数据发送到 influx db。但我不知道如何处理 python 脚本。我试图找到例子但没有成功。如果有人指导我,我将非常感激。 非常感谢

我根据 Pigueiras 的建议更改了代码,它看起来像这样

import datetime
import random
import time
import os
import csv
from csv import reader
import argparse
from influxdb import client as influxdb


db = influxdb.InfluxDBClient(host, 8086, rob, xxxx, sensors_data)
def read_data():
    with open('file.csv') as f:
        return [x.split(',') for x in f.readlines()[1:]]

a = read_data()

for metric in a:
    influx_metric = [{
        'measurement': 'your_measurement',
        'time': a[0],
        'fields': {
            'value': a[1]
        }
    }]
    db.write_points(influx_metric)

我试过这段代码,它给了我以下错误

 'NameError: name 'your_measurement' is not defined

如果我使用 like like 'measurement':'your_measurement'。然后我得到了这个错误。 ......

    File "all_flux.py", line 37, in <module>
db.write_points(influx_metric)
  File "/usr/local/lib/python2.7/dist-packages/influxdb/client.py", line 411, in write_points
tags=tags, protocol=protocol)
  File "/usr/local/lib/python2.7/dist-packages/influxdb/client.py", line 461, in _write_points
protocol=protocol
  File "/usr/local/lib/python2.7/dist-packages/influxdb/client.py", line 282, in write
data = make_lines(data, precision).encode('utf-8')
  File "/usr/local/lib/python2.7/dist-packages/influxdb/line_protocol.py", line 154, in make_lines
_convert_timestamp(point['time'], precision)
  File "/usr/local/lib/python2.7/dist-packages/influxdb/line_protocol.py", line 40, in _convert_timestamp
raise ValueError(timestamp)
ValueError: ['2017-03-23 11:50:38', '16\r\n']

DATE 字段或列看起来像这样“2017-03-23 11:50:38” 所以我使用 return [x.split(',').... 而且我也忽略了第一行。但我得到这个值错误

您只需要构建一个 JSON 正文,将您从 CSV 中读取的数据插入到 Influx 中。小心 read_data 函数,它不返回任何内容。

像这样应该可以正常工作(当然,可以优化一次插入多个点):

def read_data():
    with open('file.csv') as f:
        return [x.split(',') for x in f.readlines()[1:]]

a = read_data()

for metric in a:
    influx_metric = [{
        'measurement': 'your_measurement',
        'time': metric[0],
        'fields': {
             'value': metric[1]
        }
    }]
    db.write_points(influx_metric)

我找到了一个解决方案:将 csv 导出到 influx。 https://github.com/Bugazelle/export-csv-to-influx

安装方式:pip install ExportCsvToInflux

demo.csv

timestamp,url,response_time
2019-07-11 02:04:05,https://jmeter.apache.org/,1.434
2019-07-11 02:04:06,https://jmeter.apache.org/,2.434
2019-07-11 02:04:07,https://jmeter.apache.org/,1.200
2019-07-11 02:04:08,https://jmeter.apache.org/,1.675
2019-07-11 02:04:09,https://jmeter.apache.org/,2.265
2019-07-11 02:04:10,https://sample-demo.org/,1.430
2019-07-12 08:54:13,https://sample-show.org/,1.300
2019-07-12 14:06:00,https://sample-7.org/,1.289
2019-07-12 18:45:34,https://sample-8.org/,2.876
export_csv_to_influx \
--csv demo.csv \
--dbname demo \
--measurement demo \
--tag_columns url \
--field_columns response_time \
--user admin \
--password admin \
--force_insert_even_csv_no_update True \
--server 127.0.0.1:8086