关于截取文本文件字段到数据库中
有文本文件中有如下内容,大约有两千多行:
YTG鹰 潭-WOH芜湖东 19 17:32/17:32 25032C 56 1256 0( 0)1256 67.2 57WOH
XBK徐州北-FEH阜阳北 20 15:57/16:00 28007C 51 1159 2971( 0)4130 64.2 52FEH
JEK济南西-NJH南 京 19 12:45/12:09 21057C 62 1405 3530( 0)4935 78.5 63NSK
请问如何把他们读入access数据库中,我想用先逐行读入,再用mid函数截取,可在读第二个字段是遇到困难,鹰潭中的空格是两个半角空格,截取时始mid(str,4,4),可到第二行时徐州北又用mid(str,4,3).字段截取时定位产生困难
问题点数:60、回复次数:12Top
1 楼TechnoFantasy((VB MVP)www.applevb.com)回复于 2005-07-24 09:29:07 得分 0
楼主的截取规则是什么?就是说最后你需要截取的是哪部分?Top
2 楼Athoncj(阿龙)回复于 2005-07-24 10:35:17 得分 0
'YTG鹰 潭-WOH芜湖东' 'JEK济南西-NJH南 京'
这字符串如果导出前是Char(?)或Nchar(?)类型的就好办了,它是固定长度的;Varchar,Nvarchar就难办了.
或者用Replace("YTG鹰 潭-WOH芜湖东"," ","",1)替换掉两个半角空格,使其成为标准字符串
如果遇到一个半角空格,退出替换循环,因为:"YTG鹰 潭-WOH芜湖东 19 "中间有一个空格认为已经过了替换的需求.Top
3 楼antyell(草田先生)回复于 2005-07-24 10:46:29 得分 0
字段1 字段2 字段3 字段4 字段5 字段6 字段7 字段8 .....
YTG 鹰 潭 WOH 芜湖东 19 17:32 17:32 25032C
就取前八个字段好了. 我现在做的方法是在截取之前先判断.始终用left截取.例如
x为读入行的字符串
yy(0) = Mid(x, 1, 3)
x = Right(x, Len(x) - 3)
yy(1) = Left(Trim(x), 4)
If Right(yy(1), 1) = "-" Then
yy(1) = Left(yy(1), 3)
End If
x = Right(x, Len(x) - 4)
If Left(x, 1) = "-" Then
x = Right(x, Len(x) - 1)
End If
yy(2) = Left(x, 3)Top
4 楼antyell(草田先生)回复于 2005-07-24 10:50:39 得分 0
x = Right(x, Len(x) - 3)
yy(3) = Trim(Left(x, 4))
x = Right(x, Len(x) - 4)
yy(4) = Trim(Left(x, 3))
x = Trim(Right(x, Len(x) - 3))
yy(5) = Trim(Left(x, 5))
x = Right(x, Len(x) - 6)
yy(6) = Left(x, 5)
x = Right(x, Len(x) - 5)
yy(7) = Trim(Left(x, 12))
然后再把数组写入数据库相应字段,不知有没有更好的方法.Top
5 楼crycoming(瞎编)回复于 2005-07-24 11:36:53 得分 0
取出一行数据 然后用split函数分割到数组中Top
6 楼antyell(草田先生)回复于 2005-07-24 11:43:16 得分 0
得出结果是:
字段1 字段2 字段3 字段4 字段5 字段6
YTG 鹰潭 WOH 芜湖东 19 17:32
就取前八个字段好了. ,注意原来的文本文件中得数据没有分隔符,而是固定长度得,还有得出结果中字段2中鹰潭两字间得空格要去掉.希望大家帮忙,看有没有好方法.Top
7 楼ynsmcn(茫茫)回复于 2005-07-24 13:15:59 得分 10
含有中文的数据文件不能按固定长度处理,楼主的问题第一个中文字段不难,难的是第二个中文字段,我的代码也不是很令人满意,只能用在这个特例。
我这样做,只考虑了把两个中文字段取出来。
Private Sub Command1_Click()
Dim Fso As New FileSystemObject, sFile As TextStream
Dim strLineText As String, iMidStart As Integer, iMidLen As Integer
Set sFile = Fso.OpenTextFile(App.Path & "\data.txt", ForReading, False)
Do While Not sFile.AtEndOfLine
lLines = lLines + 1
strLineText = sFile.ReadLine
iMidStart = 4: iMidLen = InStr(1, strLineText, "-") - 4
Debug.Print Replace(Mid(strLineText, iMidStart, iMidLen), " ", vbNullString) & vbTab;
'下面跳过了一个字段:iMidStart = iMidStart + iMidLen + 4
iMidStart = iMidStart + iMidLen + 4: iMidLen = IIf(4 - InStr(iMidStart, strLineText, " ") <> 0, 4, 3)
Debug.Print Replace(Mid(strLineText, iMidStart, iMidLen), " ", vbNullString)
Loop
End SubTop
8 楼ynsmcn(茫茫)回复于 2005-07-24 13:24:12 得分 0
上面的代码lLines = lLines + 1没有用,应该删掉
Top
9 楼jxgzay(jxgzay)回复于 2005-07-24 13:36:04 得分 0
正在帮你编写代码。
Top
10 楼jxgzay(jxgzay)回复于 2005-07-24 14:10:44 得分 50
Private Sub Command1_Click()
'我把你的文本文件保存在d:\test001.txt,
Dim y(7), z(7)
'最后的z(0),z(1),...z(7)为字段内容
n = FreeFile
Open "d:\test001.txt" For Input As #n
Do While Not EOF(n)
Line Input #n, x
X1 = StrConv(x, vbFromUnicode)
y(0) = MidB(X1, 1, 3)
y(1) = MidB(X1, 4, 6)
y(2) = MidB(X1, 11, 3)
y(3) = MidB(X1, 14, 6)
y(4) = MidB(X1, 21, 2)
y(5) = MidB(X1, 24, 5)
y(6) = MidB(X1, 30, 5)
y(7) = MidB(X1, 42, 6)
For i = 0 To 7
z(i) = StrConv(y(i), vbUnicode)
If i = 1 Or i = 3 Then '第二和第四字段是中文,压缩空格
z(i) = Replace(z(i), " ", "")
End If
Debug.Print z(i)
Next
Loop
Close #n
End Sub
Top
11 楼jxgzay(jxgzay)回复于 2005-07-24 14:15:23 得分 0
要点:
1、 StrConv(x, vbFromUnicode)
2、 MidB
3、 Replace(z(i), " ", "")
4、 StrConv(x, vbUnicode)Top
12 楼antyell(草田先生)回复于 2005-07-24 22:36:56 得分 0
感谢大家关注Top




