| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2924 人关注过本帖, 1 人收藏
标题:读取TXT数据到数组
只看楼主 加入收藏
yuk_yu
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:334
专家分:134
注 册:2009-3-16
结帖率:85.71%
收藏(1)
已结贴  问题点数:100 回复次数:9 
读取TXT数据到数组
Desktop.zip (103.75 KB)

请大家帮帮忙,我一直没找到读取这个Txt的有效方法,谢谢了
2015-12-11 16:16
xiangyue0510
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:86
帖 子:941
专家分:5244
注 册:2015-8-10
收藏
得分:0 
感觉你的这个格式是固定的,而且像是在固定的第N个字符出现。
前三个数据,直接读取整行之后,判断关键词,通过之后,按照N~M位提取即可。
line input #1,a 
if instr(a,"Individual Ref.no: ")>0 then V1=right(left(a,m1),m1-n1)


后面的烦一点,但也需要一个判断用的变量,再用同样的方式来处理,中间刻意跳过无用的几行就可以
程序代码:
if instr(a,"Total Reqd for SLoc")>0 then 
  v2=right(left(a,m2),m2-n2) 'Component Number
  line input #1,a
  v3=right(left(a,m3),m3-n3)  '第1行Qty
  v4=right(left(a,m4),m4-n4)  '第1行Vender
  line input #1,a
  v5=right(left(a,m5),m5-n5)  '第2行Qty
  v6=right(left(a,m6),m6-n6)  '第2行Vender
End if

  

2015-12-12 18:38
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:0 
需要注意一下,防止出现中文字,所以建议使用 字节数据处理。

昨天本想动一下,但没时间了。
你数据保存,建议使用结构体来保存。中间那一段,有几行,没有第一节,只有后面几节的,说明那里需要特殊处理。
这个文件不适应完整使用数组来保存,而是使用结构体中的数组来保存。
等有空来弄一下。

授人于鱼,不如授人于渔
早已停用QQ了
2015-12-12 19:59
HVB6
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:15
帖 子:331
专家分:561
注 册:2013-10-30
收藏
得分:20 
回复 楼主 yuk_yu
附件产生的数据文件是“数据.xls”,可以一次处理6666个文件,修改“读取txt文件数据.exe”的代码,就可以处理6666*32*256个(54613333个)文件。
数据.zip (12.98 KB)

2015-12-13 17:50
yuk_yu
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:334
专家分:134
注 册:2009-3-16
收藏
得分:0 
回复 3楼 风吹过b
谢谢版主,我一直试过好多办法都没搞定!格式是固定的,但行数是变动的
2015-12-14 14:25
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:80 
我是放在模块里的。建议你也放到模块里。
程序代码:
Option Explicit

Public Type AssemblyType
    AssemblyNumber  As String
    Description As String
    QuantitySetup As String
End Type

Public Type ComponentType2
    AvailStock As String
    Qtytopull As String
    Vendor     As String
    Batch      As String
    MvmtReqdWorkcenter  As String
End Type

Public Type ComponentType
    ComponentNumber As String
    DescriptionTypeSecBin As String
    AvailCount As Long
    Avail() As ComponentType2
End Type

Public Type Pull_List_Tpye
    Type                As String
    Plant               As String
    IndividualRefno     As String
    Parentreferencenumber   As String
    Storagelocationsforremoval  As String
    Storagelocationforreplenishment As String
    Exclusions As String
    CostCenter As String
    Assembly() As AssemblyType
    Component() As ComponentType
End Type

Public Sub Red_Pull_List(FileName As String, ByRef d As Pull_List_Tpye)
'D 是按显式申明地址传递的,该变量保存读取后的结果

If Dir(FileName) = "" Then Exit Sub

Dim File_Zt As Long             '0=未读取,1=未进入头,2=头,3=Assembly,4=Component Title ,5=Component
File_Zt = 0

Dim fr As Long
fr = FreeFile

Dim s As String
Dim assemblycount As Long
Dim Componentcount As Long

assemblycount = -1
Componentcount = -1

Open FileName For Input As #1

File_Zt = 1
Do While Not EOF(fr)

Line Input #fr, s

Select Case File_Zt
    Case 0, 1
        If InStr(1, s, "Pull List") > 0 Then
            File_Zt = 2
        End If
       
    Case 2
        If InStr(1, s, "Type") > 0 Then
            d.Type = Trim(Mid(s, 6))
           
        ElseIf InStr(1, s, "Plant") > 0 Then
            d.Plant = Trim(Mid(s, 7))
           
        ElseIf InStr(1, s, "Individual Ref.no") > 0 Then
            d.IndividualRefno = Trim(Mid(s, 19))
           
            d.Parentreferencenumber = Trim(Mid(d.IndividualRefno, InStr(1, d.IndividualRefno, "Parent reference number:") + 24))
            d.IndividualRefno = Trim(Left(d.IndividualRefno, InStr(1, d.IndividualRefno, "Parent reference number:") - 1))

        ElseIf InStr(1, s, "Storage locations for removal") > 0 Then
            d.Storagelocationsforremoval = Trim(Mid(s, 31))
           
        ElseIf InStr(1, s, "Storage location for replenishment") > 0 Then
            d.Storagelocationforreplenishment = Trim(Mid(s, 36))
           
        ElseIf InStr(1, s, "Exclusions") > 0 Then
            d.Exclusions = Trim(Mid(s, 12))
           
        ElseIf InStr(1, s, "Cost Center") > 0 Then
            d.CostCenter = Trim(Mid(s, 13))
           
        ElseIf InStr(1, s, "Assembly Number") > 0 Then
            File_Zt = 3
        End If
   
    Case 3
        If InStr(1, s, "-----------") = 0 Then
           
            If InStr(1, s, "Component Number") > 0 Then
                File_Zt = 4
            Else
           
                If Len(s) > 0 Then
                    assemblycount = assemblycount + 2
                    ReDim Preserve d.Assembly(assemblycount)
                    With d.Assembly(assemblycount - 1)
                        .AssemblyNumber = Trim(Left(s, 19))
                        .Description = Trim(Mid(s, 20, 39))
                        .QuantitySetup = Trim(Mid(s, 58, 18))
                    End With
                    If Len(s) > 135 Then
                    With d.Assembly(assemblycount)
                        .AssemblyNumber = Trim(Mid(s, 77, 19))
                        .Description = Trim(Mid(s, 96, 39))
                        .QuantitySetup = Trim(Mid(s, 134))
                    End With
                    Else
                        assemblycount = assemblycount - 1
                        ReDim Preserve d.Assembly(assemblycount)
                    End If
                End If
               
            End If
        End If
       
    Case 4
        If InStr(1, s, "Type  Sec Bin") > 0 Then
            File_Zt = 5
        End If
    Case 5
        If Len(s) > 0 Then
        If InStr(1, s, "-----------") = 0 And Asc(s) <> 124 Then
            If Asc(s) > 32 Then
                Componentcount = Componentcount + 1
                ReDim Preserve (Componentcount)
                With (Componentcount)
                    .AvailCount = -1
                    .ComponentNumber = Trim(Left(s, 19))
                    .DescriptionTypeSecBin = Trim(Mid(s, 20))
                End With
            Else
                With (Componentcount)
                    .AvailCount = .AvailCount + 1
                    ReDim Preserve .Avail(.AvailCount)
                   
                    .Avail(.AvailCount).AvailStock = Trim(Mid(s, 45, 18))
                    .Avail(.AvailCount).Qtytopull = Trim(Mid(s, 64, 14))
                    .Avail(.AvailCount).Vendor = Trim(Mid(s, 78, 11))
                    .Avail(.AvailCount).Batch = Trim(Mid(s, 89, 11))
                    If Len(s) > 127 Then
                        .Avail(.AvailCount).MvmtReqdWorkcenter = Trim(Mid(s, 100, 27))
                    Else
                        .Avail(.AvailCount).MvmtReqdWorkcenter = Trim(Mid(s, 100))
                    End If
                End With
            End If
        End If
        End If
End Select
       
Loop

Close #1

End Sub


调用:
Dim d As Pull_List_Tpye
Call Red_Pull_List(Text1.Text, d)
Stop
你暂停后看本地数据,就知道如何引用了。
这个TXT,基本上都解析了,就是 文件头和文件尾,还是 每项的 小计没去解析。

代码没怎么去注释,自己慢慢看。应该还算可以,都是比较简单的命令,只是繁琐一些。

----------------
同样未考虑中文问题,如果文件包含中文,会错的一塌糊涂。


[此贴子已经被作者于2015-12-14 16:42编辑过]


授人于鱼,不如授人于渔
早已停用QQ了
2015-12-14 16:38
yuk_yu
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:334
专家分:134
注 册:2009-3-16
收藏
得分:0 
程序代码:
Private Sub Command1_Click()
    Dim StartLog As Boolean
    Dim Arr, i%
    StartLog = False
    Open "C:\M49855360174X.txt" For Input As #1
    ReDim Arr(1 To 1000, 1 To 4)
    Do While Not EOF(1)
        Line Input #1, a
        If StartLog = True And InStr(a, "Jabil Circuit Pull List Report") > 0 Then Exit Do
        If InStr(a, "Individual Ref.no:") > 0 Then
            i = i + 1
            Arr(i, 1) = Trim$(Mid(a, 19, 15))
            Arr(i, 2) = Mid(Split(a, ":")(1), 11, 4)
        End If
        If InStr(a, "Storage location for replenishment:") > 0 Then Arr(i, 4) = Split(a, ":")(1)
        If InStr(a, "Cost Center:") > 0 Then Arr(i, 3) = Split(a, ":")(1)

        If InStr(a, "Avail Stock") > 0 Then StartLog = True: GoTo NextLine
        If StartLog Then
            If InStr(a, "------------") > 0 Then
                GoTo NextLine
            Else
                If InStr(1, Mid(a, 1, 18), "       ") = 0 Then
                    i = i + 1
                    Arr(i, 1) = Mid(a, 1, 18)
                Else
                    Arr(i, 2) = Arr(i, 2) + CLng(Trim$(Mid(a, 57, 19)))
                    Arr(i, 3) = CLng(Trim$(Mid(a, 77, 8)))
                    Arr(i, 4) = Trim$(Mid(a, 99, 6))
                End If
            End If
        End If
NextLine:
    Loop
    Close #1
    Erase Arr
End Sub

谢谢版主,我继续研究下版主的代码!我附上这个代码是我在版主的基础上写的,基本可以解决问题了!再次感谢!
2015-12-14 17:50
yuk_yu
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:334
专家分:134
注 册:2009-3-16
收藏
得分:0 
回复 6楼 风吹过b
谢谢版主,但我测试时为何提示参数类型不符?   Call Red_Pull_List("C:\M49855360174X.txt", 5)
2015-12-14 18:04
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:0 
你看了我调用前的数据定义吗?
Dim d As Pull_List_Tpye
Call Red_Pull_List(Text1.Text, d)

授人于鱼,不如授人于渔
早已停用QQ了
2015-12-14 21:28
yuk_yu
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:334
专家分:134
注 册:2009-3-16
收藏
得分:0 
回复 9楼 风吹过b
再次感谢版主解答,向你致敬,学习!!
2015-12-15 09:26
快速回复:读取TXT数据到数组
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.057367 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved