如何处理 DECIMAL 列的 CSV 文件中缺少的值



我正在使用pyodbc从.csv文件中将数据读取到数据库。

一列在 SQL Server 中定义为decimal(18,4),但此列中缺少值。因此,当我尝试插入它时,它会抛出一个错误,指出字符串类型无法转换为数字类型。

数据看起来像

[A, B, C, , 10, 10.0, D, 10.00]

正如您在位置 4 看到的,有一个缺失值 '',它应该是一个浮点数,如 4.3526

我想将此行读取到第 4 列定义为decimal(18,4)的数据库中,它应该看起来像

A B C NULL 10 10.0 D 10.00

在数据库中。

编辑:

这是我的代码

def load_data(c, infile, num_rows = None, db_schema = 'dbo',table_name = 'new_table'):
try:
if num_rows:
dat = pd.read_csv(infile, nrows = num_rows)
else:
dat = pd.read_csv(infile)
l = dat.shape[1]
c.executemany('INSERT INTO {}.{} VALUES {}'.format(db_schema,table_name,'(' + ', '.join(['?']*l) + ')'), dat.values.tolist())
except :
with open(infile) as f:
dat = csv.reader(f)
i = 0
for row in dat:
if i == 0:
l = len(row)
else:
c.execute('INSERT INTO {}.{} VALUES {}'.format(db_schema,table_name,'(' + ', '.join(['?']*l) + ')'), *row)
if num_rows:
if i == num_rows:
break
i += 1
print(db_schema + '.' + table_name+' inserted successfully!')

请忽略缩进错误。

谢谢。

如果 pandas 的 read_csv 方法返回缺失值的空字符串,那么您的 CSV 文件很可能使用"标点符号样式"逗号分隔符(逗号后有一个空格(而不是"严格"逗号分隔符(没有多余的空格(。

考虑"严格"的 CSV 文件

1,,price unknown
2,29.95,standard price

熊猫代码

df = pd.read_csv(r"C:UsersGordDesktopno_spaces.csv", header=None, prefix='column')
print(df)

生产

column0  column1         column2
0        1      NaN   price unknown
1        2    29.95  standard price

缺失值被解释为NaN(不是数字(。

但是,如果 CSV 文件包含

1, , price unknown
2, 29.95, standard price

然后相同的代码生成

column0 column1          column2
0        1            price unknown
1        2   29.95   standard price

请注意,缺失值实际上是一个包含单个空白 (' '( 的字符串。您可以使用print(df.to_dict())进行验证。

如果您希望read_csv正确解析该CSV文件,则需要使用sep=', '以便字段分隔符包含空格

df = pd.read_csv(r"C:UsersGordDesktopwith_spaces.csv", header=None, prefix='column', sep=', ', engine='python')
print(df)

这再次给了我们

column0  column1         column2
0        1      NaN   price unknown
1        2    29.95  standard price

您可以使用 case 语句来处理此问题,以使空白值NULL.像这样:

declare @table table (c decimal(18,4))
declare @insert varchar(16) = ''
--insert into @table
--select @insert
--this would cause an error
insert into @table
select case when @insert = '' then null else @insert end 
--here we use a case to handle blanks
select * from @table

我会使用 NULLIF 插入 null,其中值 = ''

declare @table table (c decimal(18,4))
declare @insert varchar(16) = ''
insert into @table
select NULLIF(@insert,'')

相关内容

  • 没有找到相关文章

最新更新