将具有以下结构的 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?
使用 Python 将 CSV 文件导入 sqlite3 数据库表