0

まず、これを読んでくれてありがとう。私はこれを解決するために過去 4 時間を費やしました。

基本的に、ユーザーが日付、名前、電話番号、インストラクター名を単純なcsv .txtデータベースファイルに入力するアプリケーションを構築しています。私はすべての作業を持っています。

あとは、どうにかして詳細をグループ化し、他のエントリから分離するだけです。

これらのグループ化された詳細をバブル ソートで日付別に並べ替えてから、別のファイルに保存したいと考えています。並べ替えと言うときは、他の詳細を日付と一緒に並べたいと思います。

アプリケーションに入力する日付は、(yyMMddhhmm) である必要があります。例:1308290930 = 9:30 on 29/08/13

今までやってきたことを投稿できます。

Public Class Form2
    Dim currentRow As String()
    Dim count As Integer
    Dim one As Integer
    Dim two As Integer
    Dim three As Integer
    Dim four As Integer

    Dim catchit(100) As String
    Dim count2 As Integer
    Dim arrayone(50) As Integer
    Dim arraytwo(50) As String
    Dim arraythree(50) As Integer
    Dim arrayfour(50) As String

    Dim bigstring As String
    Dim builder As Integer
    Dim twodata As Integer

    Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'Me.RichTextBox1.LoadFile("D:\completerecord.txt", RichTextBoxStreamType.PlainText)

        Using MyReader As New Microsoft.VisualBasic.FileIO.TextFieldParser("D:\completerecord.txt")
            MyReader.TextFieldType = FileIO.FieldType.Delimited
            MyReader.SetDelimiters(",")
            Dim currentRow As String()
            Dim count As Integer
            count = 0
            While Not MyReader.EndOfData
                Try
                    currentRow = MyReader.ReadFields()
                    Dim currentField As String
                    For Each currentField In currentRow
                        ' makes one array to contain a record for each peice of text in the file
                        'MsgBox(currentField) '- test of Field Data
                        ' builds a big string with new line-breaks for each line in the file

                        bigstring = bigstring & currentField + Environment.NewLine

                        'build two arrays for the two columns of data
                        If (count Mod 2 = 1) Then
                            arraytwo(two) = currentField
                            two = two + 1
                            'MsgBox(currentField)
                        ElseIf (count Mod 2 = 0) Then
                            arrayone(one) = currentField
                            one = one + 1
                        End If

                        count = count + 1
                        'MsgBox(count)
                    Next

                Catch ex As Microsoft.VisualBasic.FileIO.MalformedLineException
                    MsgBox("Error Occured, Please contact Admin.")
                End Try
            End While
        End Using
        RichTextBox1.Text = bigstring
        ' MsgBox("test")

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim NoMoreSwaps As Boolean
        Dim counter As Integer

        Dim Temp As Integer
        Dim Temp2 As String
        Dim listcount As Integer
        Dim builder As Integer
        Dim bigString2 As String = ""

        listcount = UBound(arraytwo)
        'MsgBox(listcount)
        builder = 0
        'bigString2 = ""
        counter = 0
        Try
            'this should sort the arrays using a Bubble Sort
            Do Until NoMoreSwaps = True
                NoMoreSwaps = True
                For counter = 0 To (listcount - 1)
                    If arraytwo(counter) > arraytwo(counter + 1) Then
                        NoMoreSwaps = False

                        If arraytwo(counter + 1) > 0 Then

                            Temp = arraytwo(counter)
                            Temp2 = arrayone(counter)

                            arraytwo(counter) = arraytwo(counter + 1)
                            arrayone(counter) = arrayone(counter + 1)

                            arraytwo(counter + 1) = Temp
                            arrayone(counter + 1) = Temp2
                        End If
                    End If
                Next
                If listcount > -1 Then
                    listcount = listcount - 1
                End If
            Loop

            'now we need to output arrays to the richtextbox first we will build a new string
            'and we can save it to a new sorted file
            Dim FILE_NAME As String = "D:\sorted.txt"

            If System.IO.File.Exists(FILE_NAME) = True Then
                Dim objWriter As New System.IO.StreamWriter(FILE_NAME, True)

                While builder < listcount
                    bigString2 = bigString2 & arraytwo(builder) & "," & arrayone(builder) + Environment.NewLine

                    objWriter.Write(arraytwo(builder) & "," & arrayone(builder) + Environment.NewLine)
                    builder = builder + 1
                End While
                RichTextBox2.Text = bigString2

                objWriter.Close()
                MsgBox("Text written to log file")
            Else
                MsgBox("File Does Not Exist")
            End If
        Catch ex As Exception
            MsgBox(ex.Message)

        End Try
    End Sub
End Class
4

2 に答える 2

0

次のように、各エントリの情報を保持するクラスを作成します。

Public Class MyEntry
    Public Property TheDate() As DateTime
        Get
            Return m_Date
        End Get
        Set
            m_Date = Value
        End Set
    End Property
    Private m_Date As DateTime
    Public Property Name() As String
        Get
            Return m_Name
        End Get
        Set
            m_Name = Value
        End Set
    End Property
    Private m_Name As String
    Public Property PhoneNumber() As String
        Get
            Return m_PhoneNumber
        End Get
        Set
            m_PhoneNumber = Value 
        End Set
    End Property
    Private m_PhoneNumber As String
    Public Property Instructor() As String
        Get
            Return m_Instructor
        End Get
        Set
            m_Instructor = Value
        End Set
    End Property
    Private m_Instructor As String

    Public Sub New(date As DateTime, name As String, phoneNumber As String, instructor As String)
        TheDate = date
        Name = name
        PhoneNumber = phoneNumber
        Instructor = instructor
    End Sub
End Class

これで、次のように上記のクラスのリストを作成できます。

Private entries As var = New List(Of MyEntry) From { _
    New MyEntry(DateTime.Now.AddDays(-1), "Dummy 1", "555-123-4567", "Instructor A"), _
    New MyEntry(DateTime.Now.AddDays(-1), "Dummy 2", "555-124-4567", "Instructor B"), _
    New MyEntry(DateTime.Now.AddDays(-1), "Dummy 3", "555-125-4567", "Instructor C"), _
    New MyEntry(DateTime.Now.AddDays(-2), "Dummy 4", "555-126-4567", "Instructor A"), _
    New MyEntry(DateTime.Now.AddDays(-2), "Dummy 5", "555-127-4567", "Instructor B") _
}

注: ここで実際の値を置き換える必要があり、そのためにある種のループ構造を使用します。

GroupByこれで、LINQ関数を次のようにエントリのリストに適用できます。

Private entriesByDate As var = entries.GroupBy(Function(x) x.TheDate).ToList()

これにより、上で作成したダミー データの 2 つのエントリのリストが作成されます。グループ化の量は、実際のデータによって異なります。

これで、次のようにグループのリストをループできます。

For Each entry In entriesByDate
    ' Put logic here to save each group to file
Next
于 2013-09-01T02:39:08.090 に答える
0

私の提案は、到達記録 (日付、時刻など) の最後にマーカーを追加することです。「|」を使っています。次に、データを読み戻すときに、レコードを配列に分割し、それを使用して読み取ります。

したがって、次のようになります。 130829|0930|<name>|<phone number>|etc

わかりますか?

于 2013-09-01T02:39:18.797 に答える