注册 登录
编程论坛 VFP论坛

关于csv转dbf问题请教

redrum0618 发布于 2021-05-01 21:50, 3767 次点击
只有本站会员才能查看附件,请 登录

表格内有5行3列的数据,有几个单元格是空的。
CREATE CURSOR 测试(数据1 n(7,2),数据2 n(7,2),数据3 n(7,2))
APPEND FROM GETFILE() TYPE DELIMITED
BROWSE

我想转换成DBF表格,原来表格内是空的单元格仍旧是让它空着,不想默认是0,不知道如何操作?
27 回复
#2
sdta2021-05-01 22:48
程序代码:
CREATE CURSOR 测试(数据1 n(7,2),数据2 n(7,2),数据3 n(7,2))
APPEND FROM GETFILE() TYPE DELIMITED
FOR lnJ = 1 TO FCOUNT()
    lczd = FIELD(lnJ)
    BLANK FIELDS (lczd) FOR &lczd = 0
ENDFOR
BROWSE
#3
redrum06182021-05-01 22:52
回复 2楼 sdta
谢谢,明天我再试试。
#4
redrum06182021-05-01 22:54
回复 3楼 redrum0618
还有个问题,对于数值型字段来说,如何区分0和空的单元格呢?好像empty()区分不了。
#5
sdta2021-05-01 22:58
ISBLANK()
ISNULL()
自己看看需要那个
#6
redrum06182021-05-02 05:49
回复 5楼 sdta
只有本站会员才能查看附件,请 登录

昨天没有表达清楚,如果原来csv表格里有些单元格是空的,但是有些单元格是有数据的,而且是0,那该如何处理?
#7
schtg2021-05-02 06:01
2楼已经解决问题啦。
若有字符型字段时,需改为:
CREATE CURSOR 测试(数据1 n(7,2),数据2 n(7,2),数据3 n(7,2))
APPEND FROM GETFILE() TYPE DELIMITED
lnG = FCOUNT()
FOR lnJ = 1 TO lnG
   lczd = FIELD(lnJ)
   IF TYPE(lczd)=="N"
     BLANK FIELDS (lczd) FOR &lczd = 0
    ENDIF   
ENDFOR
BROWSE

[此贴子已经被作者于2021-5-2 06:07编辑过]

#8
redrum06182021-05-02 06:08
回复 7楼 schtg
2楼的代码只有在原始数据都没有0的情况下是可以的,但是如果原始数据有些是0的,那就不可以变成空的单元格。
#9
schtg2021-05-02 06:11
回复 8楼 redrum0618
发送数据上来,测试一下。
只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2021-5-2 06:15编辑过]

#10
redrum06182021-05-02 06:12
回复 7楼 schtg
CREATE CURSOR 测试(数据1 c(7),数据2 c(7),数据3 c(7))
APPEND FROM GETFILE() TYPE DELIMITED
BROWSE

还是设成字符型的吧,省力一点,要设计计算时再val()转换吧。
#11
redrum06182021-05-02 06:14
回复 9楼 schtg
我意思是csv表格里有些单元格是空的,是代表没有数据,转换成DBF时仍旧要求是空的,有些单元格有数据,而且是0,转换成DBF时要求不能清空,也要是0
#12
redrum06182021-05-02 06:16
回复 9楼 schtg
只有本站会员才能查看附件,请 登录
#13
schtg2021-05-02 06:17
回复 12楼 redrum0618
请看9楼图示哈,VFP9代码,win7下测试,绝对可行的哈,^_^
#14
schtg2021-05-02 06:20
回复 11楼 redrum0618
用空判断吧
#15
redrum06182021-05-02 06:25
回复 14楼 schtg
字符型转换最简单,后面只需要用empty()判断就行了,只是计算时要val()先转换数据类型。
要是数值型就比较麻烦了,不知道怎么区分csv表格中的0和空的单元格。
#16
schtg2021-05-02 06:27
回复 15楼 redrum0618
这个办法最简单哈。
#17
sdta2021-05-02 10:21
只有本站会员才能查看附件,请 登录

在此之前,红框处曾经是0,后来被删除了,所以用下面代码测试,此处在VFP显示仍然为0
CREATE CURSOR 测试(数据1 n(7,2),数据2 n(7,2),数据3 n(7,2))
APPEND FROM GETFILE() TYPE DELIMITED
BROWSE
#18
吹水佬2021-05-02 12:13
空的转NULL
只有本站会员才能查看附件,请 登录
#19
sdta2021-05-02 13:57
实际上,有零无零无所谓
#20
redrum06182021-05-03 19:47
回复 18楼 吹水佬
空的转NULL是什么意思?是append from后自动转好了吗?那append from ...这条语句该怎么写?
#21
redrum06182021-05-03 19:48
回复 19楼 sdta
特定场合,所以对我来说0和空的有很大区别。所以转DBF后原来是0还是0,原来是空的一定要是空的。
#22
吹水佬2021-05-03 21:17
以下是引用redrum0618在2021-5-3 19:47:06的发言:

空的转NULL是什么意思?是append from后自动转好了吗?那append from ...这条语句该怎么写?

自己解释csv文件的 "" 或 "0" 转为数值 NULL 或 0
#23
redrum06182021-05-04 18:32
回复 22楼 吹水佬
麻烦吹版详细说说,CSV里的空单元格转成DBF后也是空格,或是变成NULL,应该怎么操作?
#24
吹水佬2021-05-04 19:16
以下是引用redrum0618在2021-5-4 18:32:06的发言:

麻烦吹版详细说说,CSV里的空单元格转成DBF后也是空格,或是变成NULL,应该怎么操作?

22楼不是说了吗?
读取CSV数据,“”的就是NULL值,“O”是0
#25
redrum06182021-05-04 19:20
回复 24楼 吹水佬
你是说在CSV格式中就把空单元格用NULL代替,然后再用append from 吗?
那样感觉太麻烦了,最好是直接用代码处理,我的DBF字段都是数值型的,转为DBF后原来是0的还是0,不过空单元格也是0,所以就没办法区分DBF中的0到底是原来就是0还是原来是空的单元格。
只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2021-5-4 19:23编辑过]

#26
吹水佬2021-05-04 22:19
append from CSV 怕不能满足要求
数值型的字段也可以存NULL值,18楼的表格数据全是数值类型,你可能没留意到吧。
是用代码处理的,难道用手工去处理也叫编程?
学编程的就不要怕麻烦,有时为求目的也要不择手段

[此贴子已经被作者于2021-5-4 22:21编辑过]

#27
redrum06182021-05-05 09:44
回复 26楼 吹水佬
18楼的看到了,我就是想问问代码是怎么写的
#28
吹水佬2021-05-05 10:32
以下是引用redrum0618在2021-5-5 09:44:33的发言:

18楼的看到了,我就是想问问代码是怎么写的

CSV是文本文件,从CSV读出数据再写到DBF
简单的用FILETOSTR()就可将整个CSV读出,之后就是取数变数了

[此贴子已经被作者于2021-5-5 10:34编辑过]

1