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
|