2017-03-02 21 views
0

パイプ( "|")で区切られたテキストファイルを移動して、読み込んだ行と列の両方を制御できるようになっています。水平移動と垂直移動を指定します

私はこれまでMS Access VBAでこれを達成していますが、現在はVB.NETを開始していますが、これを完了するのに苦労しています。 Accessで

、VBAを区切りとして、事前定義された、私はレコード(Dim rs As DAO.Recordset)などのテキストファイルにリンクさせ、私は必要なフィールド/列(rs!Field1)を選択しながら行(rs.MoveNextまたはrs.MovePrevious)を介して移動します。

VB.NETに相当するものはありますか?これまでのところ私は、MSDNから次を見つけることができたが、それを操作する方法がわからない:

Using MyReader As New Microsoft.VisualBasic.FileIO.TextFieldParser(FName) 

     MyReader.TextFieldType = FileIO.FieldType.Delimited 
     MyReader.SetDelimiters("|") 
     Dim currentrow As String() 

     While Not MyReader.EndOfData 

      currentrow = MyReader.ReadFields() 
      Dim currentfield As String 
      For Each currentfield In currentrow 
       MsgBox(currentfield) 
      Next 

     End While 

    End Using 

私は後で.CSVファイルに書き込まれるように、変数に特定のフィールドを保存できるようにしたいですに。これは役立つかもしれない人のために

答えて

1

は、私は2つの以下のウェブサイトの助けを借りて、この問題を解決するために管理:

これらを使用して

Loop Through Files in Directory

Delimit Data

私は、次のボタンクリックサブを作成し、付属の関数:

Private Sub Button_Run_Click(sender As Object, e As EventArgs) Handles Button_Run.Click 

    ' Make a reference to a directory 
    Dim strDir As String = ("C:\") 
    Dim Dir As New System.IO.DirectoryInfo(strDir) 

    ' Get a reference to each file in that directory 
    Dim fiArr As System.IO.FileInfo() = Dir.GetFiles() 

    Dim fri As System.IO.FileInfo 

    'For each file call the formatter to write to a text file 
    'Then delete each file after writing it 
    For Each fri In fiArr 
     Call Formatter(strDir & fri.Name) 
     My.Computer.FileSystem.DeleteFile(strDir & fri.Name) 
    Next fri 

End Sub 

次に、各行をデリミタで区切ります(values(0)変数を使用して)ieldを取得し、そのインデックスを使用して変更することができます。行を制御することは、i整数を変更することによって、新しい変数を使用して、または既存の変数を変更することと同じくらい簡単です。例えば:

Public Sub Formatter(ByVal FName As String) 

    'Standard start defining stream reader to loop 
    'through and pull data from text files 
    'FName is provided from the form button sub 
    Dim StrReader As New System.IO.StreamReader(FName) 

    Dim text As String = StrReader.ReadToEnd 

    StrReader.Close() 

    Dim lines() As String = text.Split(vbLf) 

    'Define all variables that may need to be stored before writing 
    Dim x1, x2, x3, x4, x5, x6, x7, x8, x9, x0 As String 

    'Define where the data will be written to (line by line) 
    Dim FPath As String = "C:\Sample.txt" 
    If Not System.IO.File.Exists(FPath) Then 
     System.IO.File.Create(FPath).Dispose() 
    End If 
    Dim objwriter As System.IO.StreamWriter 

    'Set loop to go through all data from beginning to end using i as line index 
    Dim i As Double 
    For i = 0 To lines.Length - 1 

     'Split each line by pipes (|) allowing "values" to be indexed to pull by column 
     Dim values() As String = lines(i).Split("|") 

     'Set 1st column in row as switch item 
     Select Case values(0) 

      'If 1st column in row is 001, store required data in variables 
      'specified using the index of the value to give accurate column 
      Case "001" 
       x1 = values(1) 
       x2 = values(2) 
       x3 = values(3) 
       x3 = values(4) 

       'Repeat same as 001 but for 002 
      Case "002" 
       x4 = values(1) 
       x5 = values(2) 

       'Repeat same as 001 but for 003 
      Case "003" 
       x6 = values(1) 
       x7 = values(2) 

       'Write to file including fields 1 & 3 from 004 group 
      Case "004" 

       objwriter = System.IO.File.AppendText(FPath) 
       objwriter.WriteLine(x1 & "," & x2 & "," & x3 & "," & x4 _ 
        & "," & x5 & "," & x6 & "," & x7 & "," _ 
        & Nvalues(1) & "," & Nvalues(2)) 
       objwriter.Close() 

      Case Else 

     End Select 

     Application.DoEvents() 

    Next 

End Sub 

Dim Nvalues() As String = lines(i + 1).Split("|") 

がこれを使用して、私は次の関数を作成しました

関連する問題