将具有以下结构的 csv 文件导入 SQLite

Posted

技术标签:

【中文标题】将具有以下结构的 csv 文件导入 SQLite【英文标题】:importing csv file with following structure into SQLite 【发布时间】:2020-09-24 19:57:42 【问题描述】:

我之前发表了一篇关于将数据导入 SQlite 的帖子 (Getting excel data into Database - beginner)。

我做了一些进一步的研究,现在了解了基础知识,因此我创建了以下代码:

import sqlite3

conn = sqlite3.connect('financials.db')

cur = conn.cursor()

cur.execute('DROP TABLE IF EXISTS financials')
cur.execute('''
CREATE TABLE "financials"(
    "Mkt_Cap" REAL,
    "EV" REAL,
    "PE" REAL,
    "Yield" REAL
)
''')

fname = input('Enter the name of the csv file:')
if len(fname) < 1 : fname="data.csv"

with open(fname) as csv_file:
    csv_reader = csv.reader(csv_file, delimiter=',')
    for row in csv_reader:
        print(row)

以下是我的 CSV 数据当前的格式(它只是被抓取并放入 CSV 文件):

鉴于此,我是否能够使用以下方法提取表行的值:

Mkt_cap=row[0]
EV = row[1]

然后我会编写一个插入命令并提交以将数据导入数据库。

或者我需要重新格式化我的 CSV 数据吗?

【问题讨论】:

CSV 阅读器默认只返回一个字符串列表作为行。您可能必须在适当的情况下转换为数字。除了应该没问题。 @MichaelButscher 您好,感谢您的回复。您的意思是将csv中的数据转换为数字还是其他?抱歉,我对这一切都不熟悉。 【参考方案1】:

这有点棘手,因为 CSV 中的数据是转置的。通常你会让每一行定义一个年份,列是会计期间、大小写、ev 等。

您可以自己转置数据,但我会使用pandas。 假设您的 csv 根据您的屏幕截图看起来是这样的:

Valuation,,,,,,
Fiscal Period: December,2017,2018,2019,2020,2021,2022
Capitalization,270120,215323,248119,-,-
Entreprise Value (EV),262351,208330,232655,204634,200604,196917
P/E ratio,25.7x,16.0x,19.1x,67.1x,19.6x,15.3x
Yield,0.94%,1.83%,1.59%,0.83%,1.54%,1.74%

这里有一些示例代码:

import pandas as pd

df = pd.read_csv('data.csv', headers=None, na_values='-')

# first row does not mean much so let us remove it
df = df.drop(df.index[0])

# transpose the data to get it back in shape
df = df.transpose()

# use first row as header
df.columns = df.iloc[0]
# remove first row from data
df = df.drop(df.index[0])

# iterate over each row
for _, row in  df.iterrows():
    print(f'cap: row["Capitalization"]\t'
          f'EV: row["Entreprise Value (EV)"]\t'
          f'PE: row["P/E ratio"]\t'
          f'Yield: row["Yield"]')

结果:

cap: 270120 EV: 262351  PE: 25.7x   Yield: 0.94%
cap: 215323 EV: 208330  PE: 16.0x   Yield: 1.83%
cap: 248119 EV: 232655  PE: 19.1x   Yield: 1.59%
cap: 237119 EV: 204634  PE: 67.1x   Yield: 0.83%
cap: nan    EV: 200604  PE: 19.6x   Yield: 1.54%
cap: nan    EV: 196917  PE: 15.3x   Yield: 1.74%

【讨论】:

顺便说一句,pandas 不是内置库。你需要安装它pip install pandas 谢谢,我会尝试使用 pandas。我用过一点,但不是很熟悉。 嗨,我已经研究了一下 panadas,我现在很困惑的是,如何在你的示例中获取上述代码并将其插入 SQLITE 当我尝试插入时,我相信它只是试图按原样插入原始 excel 文件,而不是转置版本。 在for循环中,可以执行INSERT INTO查询,而不是打印信息。我相信您拥有所需的所有数据信息。【参考方案2】:

您可能需要先更改格式。

目前,您的标签在左侧并向下。机器从左到右寻找标签。

还要考虑排序方法并寻找索引,最容易检索列年份还是最好让它索引到索引直到它达到年份。

【讨论】:

@b1nk3x 是否有一种快速的方法可以将数据转换为所需的格式?我将在未来大量使用它,所以如果有一种快速的方法会很好。 理想情况下,我希望它具有年份作为第一行中的相关标题列。那么随后的每一行都是输入正确数据的财务指标之一。如果可能的话?? 让我问一下,你打算重用这些数据吗? 数据会经常刷新,大概每 3 到 5 个月刷新一次。但在那之前我会使用。我还希望能够将其他公司的财务数据添加到数据库中。 您应该考虑分离将使用冗余数据的表。当您需要在报告、视图和创建其他表时使用它们时,这将便于您随后使用连接器调用导入表的段。

以上是关于将具有以下结构的 csv 文件导入 SQLite的主要内容,如果未能解决你的问题,请参考以下文章

如何将加载 .sql 或 .csv 文件导入 SQLite?

将 .csv 文件导入 Android 中的 Sqlite

使用 Python 将 CSV 文件导入 sqlite3 数据库表

iPhone:将 CSV 文件导入 Sqlite 数据库时应使用哪种编码方案

SQLite新建数据库及txt文件(CSV文件)导入

在Ubuntu终端将csv文件导入sqlite3数据库,