除此之外,我必须确保当数据库中的前一个值= 'closed', 'completed', 'cancelled', 'rejected'
时,从新上传的重复票据被忽略。
使用程序:MS Excel 2013, MySQL 6.1 workbench 6.1.7
MySQL:
Column Name Datatype pk nn UQ BIN UN ZF AI Default
id varchar(45) Y Y Y
priority tinytext Null
submit_dt datetime Null
group varchar(100) Null
comp_dt datetime Null
status varchar(45) Null
CSV格式的原始样本:
id priority submit_dt group status comp_dt
222 High 1/26/2015 7:08 bread Closed 1/26/2015 15:23
333 High 1/26/2015 6:59 drinks Closed 1/26/2015 13:36
444 High 1/20/2015 9:09 meat Completed 1/20/2015 12:32
555 High 1/13/2015 10:27 salad Closed 1/13/2015 12:53
777 High 1/12/2015 11:34 milk Completed 1/13/2015 8:46
888 High 1/9/2015 10:29 crackers Completed 1/9/2015 13:01
999 High 1/16/2015 14:59 soup Closed 1/19/2015 12:26
100 High 1/6/2015 9:05 spices Closed 1/6/2015 19:11
MySQL数据库不介意接受唯一字符。你说的是非ascii字符吗?我认为你应该把关于重复票的问题作为一个单独的问题,并用一个你希望数据库存储的示例来充实它。
为了摆脱"前一个值"行,我建议在Excel中编写一个VBA宏,该宏遍历每行
row = 2
do until cells(row,5)="" ' 5 would be the relevant column-no.
...
row=row+1
loop
并在循环中检查相关单元格中先前的值并擦除这些行
if cell(row, 5)="completed" then
range(cells(row,1),cells(row,10)).select
Selection.Delete Shift:=xlUp
row=row-1
endif
然后通过宏命令将excel文件保存为CSV:
ActiveWorkbook.SaveAs Filename:= "pathfilename.csv",
FileFormat:=xlCSV, Local:=True_
'Local:= depends on the regional settings of your windows.
`e.g. if your reg.set. are western europe and you select
local:=true then the separation sign will be ";"`
在任何情况下,您应该能够在excel和/或宏中更改csv-files的分隔符
对于更专业的解决方案,我建议编写一个c#应用程序作为与mySQL-DB进行数据交换的前端。例如,您可以从这里使用csv-reader解决方案(http://www.codeproject.com/Articles/9258/A-Fast-CSV-Reader),它将自动处理分隔标志问题。该类的对象将整个数据加载为内存中的行数组,然后可以循环遍历数组以过滤掉不需要的行。最后,您可以使用ADO的对象创建一个参数化的sql字符串。