【问题标题】:CSV File to SQL Insert StatementCSV 文件到 SQL 插入语句
【发布时间】:2016-11-03 05:19:33
【问题描述】:

我有一个 CSV 文件,看起来像这样:

Date,Person,Time Out,Time Back,Restaurant,Calories,Delicious?
6/20/2016,August,11:58,12:45,Black Bear,850,Y
6/20/2016,Marcellus,12:00,12:30,Brought Lunch,,Y
6/20/2016,Jessica,11:30,12:30,Wendy's,815,N
6/21/2016,August,12:05,1:01,Brought Lunch,,Y

到目前为止,我已经设法将每一行打印到一个字符串列表中(例如 - ['Date', 'Person', 'Time Out', etc.] or ['6/20/2016', 'August', '11:58' etc.])。

现在我还需要做两件事:

  1. 为每一行添加一个 ID 标题和连续的数字字符串(例如 - ['ID', 'Date', 'Person', etc.] and ['1', '6/20/2016', 'August', etc.]
  2. 分隔每一行,以便将它们格式化为插入 语句,而不是让程序一个接一个地打印出每一行(例如 - INSERT INTO Table ['ID', 'Date', 'Person', etc.] VALUES ['1', '6/20/2016', 'August', etc.]

这是我现在的代码:

import csv

openFile = open('test.csv', 'r')
csvFile = csv.reader(openFile)
for row in csvFile:
    print (row)
openFile.close()

【问题讨论】:

  • 你的SQL表中的ID列是主键吗?如果是这样,您可以依赖 SQL 的 auto_increment 属性而忽略插入查询中的 ID 列。
  • 为什么不用MySQL内置的LOAD DATA INFILE直接从CSV文件加载到数据库,而不是用Python解析呢?
  • @Mumpo,是的。我对 MySQL 不是很熟悉,所以我不知道这是一个选项,但似乎比我上面列出的更可行。感谢您的提示。
  • @Barmar,主要是因为在将文件插入 MySQL 之前,我还想对文件做一些其他的事情,并认为首先搞砸它不会太难。但是,如果 ti 不起作用,那绝对是一种选择。谢谢你把它放在那里。

标签: python mysql python-3.x csv sql-insert


【解决方案1】:

您可以使用这个开源工具来生成批量 INSERT 语句:https://simranjitk.github.io/sql-converter/

【讨论】:

    【解决方案2】:

    如果你想保持类型转换,你可以使用这个函数,我用它用字符串 sql 语句将数据放入谷歌大查询中。

    PS:函数上可以放其他类型

    import csv
    
    def convert(value):
        for type in [int, float]:
            try:
                return type(value)
            except ValueError:
                continue
        # All other types failed it is a string
        return value
    
    
    def construct_string_sql(file_path, table_name, schema_name):
        string_SQL = ''
        try:
            with open(file_path, 'r') as file:            
                reader = csv.reader(file)
                headers = ','.join(next(reader))
                for row in reader:
                    row = [convert(x) for x in row].__str__()[1:-1]
                    string_SQL += f'INSERT INTO {schema_name}.{table_name}({headers}) VALUES ({row});'
        except:
            return ''
    
        return string_SQL 
    

    【讨论】:

      【解决方案3】:

      试试这个(我忽略了 ID 部分,因为你可以使用 mySQL auto_increment)

      import csv
      
      openFile = open('test.csv', 'r')
      csvFile = csv.reader(openFile)
      header = next(csvFile)
      headers = map((lambda x: '`'+x+'`'), header)
      insert = 'INSERT INTO Table (' + ", ".join(headers) + ") VALUES "
      for row in csvFile:
          values = map((lambda x: '"'+x+'"'), row)
          print (insert +"("+ ", ".join(values) +");" )
      openFile.close()
      

      【讨论】:

      • 那行得通。谢谢您的帮助!附带说明一下,您知道是否有任何方法可以消除 VALUES 列表中值之间不需要的空格?
      • 那些空格是故意的,只需将最后一行之前的行替换为这个:print (insert +"("+ ",".join(values) +");" )
      • 哦,不,我理解那部分,我更多的是指实际的数据字符串本身(例如 - 'UNKNOWN ', to instead be 'UNKNOWN',)
      • 您可以使用.strip() 来实现这一点。 values = map((lambda x: '"'+x.strip()+'"'), row)
      • 再次完美运行。为了确保我的钱物有所值,我将如何让它在目录中的一组文件上工作,而不仅仅是一个命名文件?我尝试使用glob.glob(filePath),然后使用csv.reader(filePathObj),但我没有取回文件的内容,而是取回了名称(例如-(INSERT INTO Table 'C:/Users/etc') VALUES ('C:/Users/etc'))
      猜你喜欢
      • 2018-12-08
      • 2010-09-05
      • 1970-01-01
      • 1970-01-01
      • 2015-04-03
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多