[心缘地方]同学录
首页 | 功能说明 | 站长通知 | 最近更新 | 编码查看转换 | 代码下载 | 常见问题及讨论 | 《深入解析ASP核心技术》 | 王小鸭自动发工资条VBA版
登录系统:用户名: 密码: 如果要讨论问题,请先注册。

[备忘]ASP+ADO的CSV出力及入力的一些注意事项

上一篇:[ASP]ASP+OO4O,OraDatabase.Parameters集合容易出现“参数重复”错误的解决方法。
下一篇:[备忘]ASP+OO4O常见错误备忘

添加日期:2007/8/9 11:24:54 快速返回   返回列表 阅读5044次
1。出力时,如果字段内容包括逗号,或双引号,两侧应该加双引号,同时,双引号应该替换为两个。

如内容为a,3,应该替换为"a,3"
如内容为a"b,应该替换为"a""b"

其他的内容直接逗号分隔即可,最后的形式如:

aaaa,bbbbb,"a,3",cccc,"a""b",ddddd

2。入力时,直接读取文件,自己一行一行的分析比较繁琐,推荐用ADO连接CSV文件。

连接字符串:

(1)ODBC:
connstr="Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=d:\data\;Extensions=asc,csv,tab,txt;"

(2)OLEDB:
connstr="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\;Extended Properties=""text;HDR=Yes;FMT=Delimited"""

注意:
<1>路径,即dbq或data source,只到目录一级,不指定文件名(在sql语句中指定)

<2>HDR=YES,表示数据的第一行作为表的标题行,也就是列名,可以用这些列名来筛选数据,进行关联什么的。

如果HDR=NO,则表示第一行开始就是数据了,那么列名自动的就是F1,F2,F3…………

可以用rs("F1"),rs("F2")等来引用,也可以在sql中用它们来筛选数据等等。

<3>FMT=Delimited,表示用默认的分隔符,而通常默认的分隔符就是逗号了。

这个默认值在注册表的

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Text\Format

位置下,默认是CSVDelimited,可以修改成Delimited(;)或Delimited(|)等等。

<4>如果某个列没有值,也就是直接两个逗号,中间什么都没有,那么对应的值是NULL,注意判断。

<5>关于数据类型的判定。
OLE DB驱动是根据数据的值来推断数据类型的……所以有时就推断的不对了。

以下是摘录:

Jet 和 ODBC 提供程序将返回占多数的类型的数据,但对于占少数的数据类型,则会返回 NULL(空)值。如果该列中两种类型数据的数量相等,提供程序将优先选择数字型数据,放弃文本型数据。

例如: 
• 在被扫描的八 (8) 行中,如果该列包含五 (5) 个数字值和三 (3) 个文本值,则提供程序将返回五 (5) 个数字和三 (3) 个空值。 
• 在被扫描的八 (8) 行中,如果该列包含三 (3) 个数字值和五 (5) 个文本值,则提供程序将返回三 (3) 个空值和五 (5) 个文本值。 
• 在被扫描的八 (8) 行中,如果该列包含四 (4) 个数字值和四 (4) 个文本值,则提供程序将返回四 (4) 个数字和四 (4) 个空值。 

作为解决只读数据问题的一种替代方法,可在连接字符串的“扩展属性”部分中使用“IMEX=1”这一设置来启用导入模式。这可强制执行 ImportMixedTypes=Text 注册表设置。但在此模式下,执行更新操作时可能会出现意外的结果。


注意,连接串里有IMEX=1,还不够,还得修改注册表,将ImportMixedTypes设置为Text才行。(我没试出来,加上还是不行哦,怪。)

注册表位置同上。

http://support.microsoft.com/default.aspx?scid=kb;zh-cn;257819
----------------------------------------------
下面是一个简单的例子:


Set conn = Server.CreateObject("ADODB.Connection")
str = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\;Extended Properties=""text;HDR=No;FMT=Delimited""" 
conn.open str

set rs=server.CreateObject("adodb.recordset")
sql="select * from abcd.csv"
rs.open sql,conn,0,1
do while not rs.eof
    response.write rs("F2") & rs("F1") & rs(2) & "<br>"
    rs.movenext
loop
rs.close
set rs=nothing
conn.close
set conn=nothing

 

评论 COMMENTS
没有评论 No Comments.

添加评论 Add new comment.
昵称 Name:
评论内容 Comment:
验证码(不区分大小写)
Validation Code:
(not case sensitive)
看不清?点这里换一张!(Change it here!)
 
评论由管理员查看后才能显示。the comment will be showed after it is checked by admin.
CopyRight © 心缘地方 2005-2999. All Rights Reserved