再次求教ASP将大量的文本数据导入到数据库中问题

zwonline99 2004-01-02 11:33:32
各位大侠:
本人正在用ASP开发一个项目,需要将大量的文本数据导入到sql server 2000数据库中,数据内容如下:
600204040003天池有限公司百货大楼 60020201290225003755 2860 123,456.96
600204040003青岛百货大楼 60020201290225003755 2860 39,785.96
600204040003上海中天百货大楼 60020201290225003755 2860 1,000.96
数据之间没有分隔符,也就是所谓的定长数据,数据结构如下:
1、编号 12字节 左对齐
2、名称 32字节 左对齐
3、账号 20字节 左对齐
4、代码 7字节 右对齐
5、金额 15字节 右对齐
以上只是一种文本的结构,其他20多种文本与此的结构类似,只是数据项更多一些。
每种文本大约有几百行至几千行,有几种上万行。
请问:
1、我已经用c++写了一部分文本的导入工具,但是我还是想用asp来做导入工作,请问如何实现?
2、我不想使用sql server的数据导入导出工具,因为对业务人员来说,每次都要决定数据的起始位置太困难,而且金额中有千分符,导入一般都不会成功。
3、我准备用fso来读取文本文件,流程如下:
读一行
用mid()和midb()来取得每个数据项
写入数据库
读下一行
但是始终不能按照“西文一个字节,中文两个字节”这一方式得到我想要的数据项,请问需要做什么字符属性的设置吗?
4、金额中的千分符如何处理?
谢谢各位,请不吝赐教。
文本是所谓的定长数据,各个数据项之间没有分隔符。请您将数据放在记事本里看,不要折行。
...全文
81 51 打赏 收藏 转发到动态 举报
写回复
用AI写文章
51 条回复
切换为时间正序
请发表友善的回复…
发表回复
zwonline99 2004-01-18
  • 打赏
  • 举报
回复
再次感谢suncicy(suncicy)!!!
zwonline99 2004-01-16
  • 打赏
  • 举报
回复
回复iamdan(egg天下),您的方法太复杂,如果让您每天导入20个不同格式的文本,您愿意吗?反正我们这里的业务人员不愿意。
iamdan 2004-01-15
  • 打赏
  • 举报
回复
先导入access,然后再吧*.mdb导入sql
zwonline99 2004-01-15
  • 打赏
  • 举报
回复
suncicy(suncicy) ,好极了,您的程序我还要测试一下。
zwonline99 2004-01-14
  • 打赏
  • 举报
回复
谢谢suncicy(suncicy),您的程序我已经运行过了,表面上看很不错,但是我将数据又改动了一下,问题就出来了,您再测试一下这个程序。谢谢您的大力帮助,您可真是一位热心人。
<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft FrontPage 4.0">
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</HEAD>
<body bgcolor="#99bbc3">
<P>
<%
Dim strOutput(3), i, iDiff
strOutput(0)="1234567890abcdefg中国公司CS中心 abcdef 123.45中国公司CS中心 abcdef 123.45"
strOutput(1)="1234567890abcdefg中国总公司总公司 abcdef 1,235,123.45中国总公司总公司 abcdef 1,235,123.45"
strOutput(2)="1234567890abcdefgABC company limited abcdef 52,339,123.45ABC company limited abcdef 52,339,123.45"

For i = 0 TO 2
Response.Write "第" & i + 1 & "行数据" & "<br>"

str1=Cutstr(strOutput(i),1,10)
str2=Cutstr(strOutput(i),11,7)
str3=Cutstr(strOutput(i),18,20)
str4=Cutstr(strOutput(i),38 ,6)
str5=Cutstr(strOutput(i),44,16)
str6=Cutstr(strOutput(i),60,20)
str7=Cutstr(strOutput(i),80,6)
str8=Cutstr(strOutput(i),86,16)

Response.Write str1 & "<br>"
Response.Write str2 & "<br>"
Response.Write str3 & "<br>"
Response.Write str4 & "<br>"
Response.Write str5 & "<br>"
Response.Write str6 & "<br>"
Response.Write str7 & "<br>"
Response.Write str8 & "<br>"

Next

REM ###########################################
REM 截取字符Cutstr(str,start,num)
REM 参数列表:
REM str: 需截取的字符
REM start: 开始位置
REM num: 截取数量
REM ###########################################
Function Cutstr(str, start, num)
Dim k, j, a, m, iFlag
k = 0
m = 0
iFlag = 0
Cutstr = ""
For j = 1 TO start - 1
a = mid(str,j,1)
if asc(a) < 0 then
m = m + 2
iFlag = 1
else
m = m + 1
end if
Next
If iFlag = 0 Then
m = start
Else
'对有双字节情况进行特殊处理
m = start - (m - (start - 1))
End If
For j = m To len(trim(str))
a = mid(str,j,1)

if asc(a) < 0 then
k = k + 2
else
k = k + 1
end if

Cutstr = Cutstr & a

If k >= num Then
Exit Function
End If
Next
End Function
%>


</body>
</html>
suncicy 2004-01-14
  • 打赏
  • 举报
回复
不好意思,没有考虑其他情况,差点误导楼主:)
还是按照第一次的思路修改了程序,估计不会再有错误。但还存在一个缺陷:
不能单独运行其中一个语句,如:str6=Cutstr(strOutput(i),60,20)。
必须运行其前面的,特别是带有双字节的语句才能保证不出错。
不知楼主及各位大侠还有没更好的方法?

<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft FrontPage 4.0">
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</HEAD>
<body bgcolor="#99bbc3">
<P>
<%
Dim strOutput(3), i, m

strOutput(0)="1234567890abcdefg中国公司CS中心 abcdef 123.45中国公司Cb中心 abcdef 123.45"
strOutput(1)="1234567890abcdefg中国总公司总公司 abcdef 1,235,123.45中国总公司总公司 abcdef 1,235,123.45"
strOutput(2)="1234567890abcdefgABC company limited abcdef 52,339,123.45ABC company limited abcdef 52,339,123.45"

For i = 0 TO 2
Response.Write "第" & i + 1 & "行数据" & "<br>"

m = 0

str1=Cutstr(strOutput(i),1,10)
str2=Cutstr(strOutput(i),11,7)
str3=Cutstr(strOutput(i),18,20)
str4=Cutstr(strOutput(i),38 ,6)
str5=Cutstr(strOutput(i),44,16)
str6=Cutstr(strOutput(i),60,20)
str7=Cutstr(strOutput(i),80,6)
str8=Cutstr(strOutput(i),86,16)

Response.Write str1 & "<br>"
Response.Write str2 & "<br>"
Response.Write str3 & "<br>"
Response.Write str4 & "<br>"
Response.Write str5 & "<br>"
Response.Write str6 & "<br>"
Response.Write str7 & "<br>"
Response.Write str8 & "<br>"

Next

REM ###########################################
REM 截取字符Cutstr(str,start,num)
REM 参数列表:
REM str: 需截取的字符
REM start: 开始位置
REM num: 截取数量
REM ###########################################
Function Cutstr(str, start, num)
Dim k, j, a, iFlag
k = 0
iFlag = 0
Cutstr = ""

For j = start - m To len(trim(str))
a = mid(str,j,1)

if asc(a) < 0 then
k = k + 2
iFlag = 1
else
k = k + 1
end if

Cutstr = Cutstr & a

If k >= num Then
If iFlag = 1 Then
m = m + (num - len(Cutstr))
End If
Exit Function
End If
Next
End Function
%>


</body>
</html>
suncicy 2004-01-13
  • 打赏
  • 举报
回复
zwonline99(zwonline)提的意见很对,当双字节数据比较多时容易写错。
我稍微修改了程序,这样就不用去考虑该数据是否是双字节问题了,你测试看看。

<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft FrontPage 4.0">
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</HEAD>
<body bgcolor="#99bbc3">
<P>
<%
Dim strOutput(3), i, iDiff
strOutput(0)="1234567890abcdefg中国公司CS中心 abcdef 123.45"
strOutput(1)="1234567890abcdefg中国总公司 abcdef 9,123.45"
strOutput(2)="1234567890abcdefgABC company limited abcdef 52,339,123.45"

For i = 0 TO 2
Response.Write "第" & i + 1 & "行数据" & "<br>"

str1=Cutstr(strOutput(i),1,10)
str2=Cutstr(strOutput(i),11,7)
str3=Cutstr(strOutput(i),18,20)
str4=Cutstr(strOutput(i),38 ,6)
str5=Cutstr(strOutput(i),44,16)

Response.Write str1 & "<br>"
Response.Write str2 & "<br>"
Response.Write str3 & "<br>"
Response.Write str4 & "<br>"
Response.Write str5 & "<br>"

Next

REM ###########################################
REM 截取字符Cutstr(str,start,num)
REM 参数列表:
REM str: 需截取的字符
REM start: 开始位置
REM num: 截取数量
REM ###########################################
Function Cutstr(str, start, num)
Dim k, j, a, m, iFlag
k = 0
m = 0
iFlag = 0
Cutstr = ""
For j = 1 TO start - 1
a = mid(str,j,1)
if asc(a) < 0 then
m = m + 2
iFlag = 1
else
m = m + 1
end if
Next
If iFlag = 0 Then
m = start
Else
'对有双字节情况进行特殊处理
m = start - (m - (start - 1))
End If
For j = m To len(trim(str))
a = mid(str,j,1)

if asc(a) < 0 then
k = k + 2
else
k = k + 1
end if

Cutstr = Cutstr & a

If k >= num Then
Exit Function
End If
Next
End Function
%>


</body>
</html>
zwonline99 2004-01-13
  • 打赏
  • 举报
回复
可不可以写一个函数,类似mid的用法,可以按单字节方式来处理双字节。
suncicy 2004-01-12
  • 打赏
  • 举报
回复
试试运行下面的代码,是否是你想要的结果?

<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft FrontPage 4.0">
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</HEAD>
<body bgcolor="#99bbc3">
<P>
<%
Dim strOutput(3), i, iDiff
strOutput(0)="1234567890abcdefg中国公司CS中心 abcdef 123.45"
strOutput(1)="1234567890abcdefg中国总公司 abcdef 9,123.45"
strOutput(2)="1234567890abcdefgABC company limited abcdef 52,339,123.45"

For i = 0 TO 2
Response.Write "第" & i + 1 & "行数据" & "<br>"

str1=Cutstr(strOutput(i),1,10)
str2=Cutstr(strOutput(i),11,7)
str3=Cutstr(strOutput(i),18,20)
iDiff = 20 - len(str3)
str4=Cutstr(strOutput(i),38 - iDiff,6)
str5=Cutstr(strOutput(i),44 - iDiff,16)

Response.Write str1 & "<br>"
Response.Write str2 & "<br>"
Response.Write str3 & "<br>"
Response.Write str4 & "<br>"
Response.Write str5 & "<br>"

Next

REM ###########################################
REM 截取字符Cutstr(str,start,num)
REM 参数列表:
REM str: 需截取的字符
REM start: 开始位置
REM num: 截取数量
REM ###########################################
Function Cutstr(str, start, num)
Dim k, j, a
k = 0
Cutstr = ""
for j = start to len(trim(str))
a = mid(str,j,1)

if asc(a) < 0 then
k = k + 2
else
k = k + 1
end if

Cutstr = Cutstr & a

If k = num Then
Exit Function
End If
Next
Cutstr = str
End Function
%>


</body>
</html>
luoluonet 2004-01-12
  • 打赏
  • 举报
回复
重写mid函数~~

好方法~
zwonline99 2004-01-12
  • 打赏
  • 举报
回复
双字节和单字节的使用可真是麻烦
imur 2004-01-12
  • 打赏
  • 举报
回复
up
zwonline99 2004-01-12
  • 打赏
  • 举报
回复
谢谢suncicy(suncicy),您的结果令人满意,您提供的方法也是到目前位置最让我满意的。
不过,我觉得还有一点欠缺,比如这几句:
iDiff = 20 - len(str3)
str4=Cutstr(strOutput(i),38 - iDiff,6)
str5=Cutstr(strOutput(i),44 - iDiff,16)
如果要处理的数据项比较多时,同时双字节数据项也比较多时,甚至每一个数据项都要这样处理才行,那么程序将非常容易写错,而且不太好找,您说呢?
还是要感谢您,如果10天之内没有比这个方法更令我满意的了,所有的分都给您。
再次谢谢您!
DeltaCat 2004-01-09
  • 打赏
  • 举报
回复
如果你的系统是中文的,而不足的字节确实是用空格补的,那么我的方法没有错误,因为中文系统中,实际没有双字节的概念
king2world 2004-01-09
  • 打赏
  • 举报
回复
我看的那个主要都是用的正则表达式
king2world 2004-01-09
  • 打赏
  • 举报
回复
用php可能会容易一些,我在别的论坛里边看到了一个类似的东西,那个能很好的解决文本到数据库的转换,要不要贴上来?
iamsangster 2004-01-09
  • 打赏
  • 举报
回复
up
zwonline99 2004-01-09
  • 打赏
  • 举报
回复
谢谢coltest(coltest)提供代码,由于我的例子不够恰当,误导您了,请看下面的例子:

<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft FrontPage 4.0">
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</HEAD>
<body bgcolor="#99bbc3">
<P>
<%
Dim strOutput
strOutput1="1234567890abcdefg中国公司CS中心 abcdef 123.45"
strOutput2="1234567890abcdefg中国总公司 abcdef 9,123.45"
strOutput3="1234567890abcdefgABC company limited abcdef 52,339,123.45"

Response.Write "第一行数据" & "<br>"
str1=trim(mid(strOutput1,1,10))
str2=trim(mid(strOutput1,11,7))
str3=trim(mid(strOutput1,18,20))
str4=trim(mid(strOutput1,38,6))
str5=trim(mid(strOutput1,44,16))

Response.Write str1 & "<br>"
Response.Write str2 & "<br>"
Response.Write str3 & "<br>"
Response.Write str4 & "<br>"
Response.Write str5 & "<br>"

Response.Write "第二行数据" & "<br>"
str1=trim(mid(strOutput2,1,10))
str2=trim(mid(strOutput2,11,7))
str3=trim(mid(strOutput2,18,20))
str4=trim(mid(strOutput2,38,6))
str5=trim(mid(strOutput2,44,16))

Response.Write str1 & "<br>"
Response.Write str2 & "<br>"
Response.Write str3 & "<br>"
Response.Write str4 & "<br>"
Response.Write str5 & "<br>"

Response.Write "第三行数据" & "<br>"
str1=trim(mid(strOutput2,1,10))
str2=trim(mid(strOutput2,11,7))
str3=trim(mid(strOutput2,18,20))
str4=trim(mid(strOutput2,38,6))
str5=trim(mid(strOutput2,44,16))

Response.Write str1 & "<br>"
Response.Write str2 & "<br>"
Response.Write str3 & "<br>"
Response.Write str4 & "<br>"
Response.Write str5 & "<br>"

%>


</body>
</html>

下面是程序的输出结果
第一行数据
1234567890
abcdefg
中国公司CS中心 abcdef

123.45
第二行数据
1234567890
abcdefg
中国总公司 abcde
f
9,123.45
第三行数据
1234567890
abcdefg
中国总公司 abcde
f
9,123.45

这个结果不是我想要,我要的结果是:
1234567890
abcdefg
中国公司CS中心
abcdef
123.45
1234567890
abcdefg
中国总公司
abcdef
9,123.45
1234567890
abcdefg
ABC company limited
abcdef
52,339,123.45
需要说明的是,这些字符串是来自文本的,并不是只有三个。
chnj1981 2004-01-09
  • 打赏
  • 举报
回复
学习!
coltest 2004-01-09
  • 打赏
  • 举报
回复
看看下边的代码能帮你吗
<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft FrontPage 4.0">
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</HEAD>
<body bgcolor="#99bbc3">
<P>
<%
Dim strOutput
strOutput1="1234567890abcdefg中国公司 abcdef 139,123.45"
strOutput2="1234567890abcdefg中国 abcdef 139,123.45"
Response.Write "第一行数据" & "<br/>"
str1=mid(strOutput1,1,10)
str2=mid(strOutput1,11,7)
str3=trim(mid(strOutput1,18,16))
str4=trim(mid(strOutput1,34,8))
str5=trim(mid(strOutput1,44,16))

Response.Write str1 & "<br/>"
Response.Write str2 & "<br/>"
Response.Write str3 & "<br/>"
Response.Write str4 & "<br/>"
for i =0 to len(str4)
response.write(" ")
next
Response.Write str5 & "<br/>"

Response.Write "第二行数据" & "<br/>"
str1=mid(strOutput2,1,10)
str2=mid(strOutput2,11,7)
str3=trim(mid(strOutput2,18,16))
str4=trim(mid(strOutput2,34,8))
str5=trim(mid(strOutput2,44,16))

Response.Write str1 & "<br/>"
Response.Write str2 & "<br/>"
Response.Write str3 & "<br/>"
Response.Write str4 & "<br/>"
for i =0 to len(str4)
response.write(" ")
next
Response.Write str5 & "<br/>"

%>


</body>
</html>
加载更多回复(31)

28,407

社区成员

发帖
与我相关
我的任务
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
  • ASP
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧