2016-11-21 12 views
0

私はファイル内にこのデータを持っており、私はそれを1行ずつ読み込もうとしています。 1列目はユーザー#、2番目は日付、3番目は時刻です。残りは無視されます。VB6 3次元配列。どのように値をグループ化するように検索して値を追加するのですか?

1 2016-11-09 08:03:51 1 0 1 0 
    2 2016-11-09 08:03:51 1 0 1 0 
    1 2016-11-09 11:22:00 1 1 1 0 
    2 2016-11-09 11:22:00 1 1 1 0 
    1 2016-11-09 13:29:06 1 1 1 0 
    2 2016-11-09 13:33:08 1 0 1 0 
    1 2016-11-09 05:17:49 1 0 1 0 
    2 2016-11-09 05:17:49 1 0 1 0 
    1 2016-11-10 08:03:51 1 0 1 0 
    2 2016-11-10 08:03:51 1 0 1 0 
    1 2016-11-10 11:22:00 1 1 1 0 
    2 2016-11-10 11:22:00 1 1 1 0 
    1 2016-11-10 13:29:06 1 1 1 0 
    2 2016-11-10 13:33:08 1 0 1 0 
    1 2016-11-10 05:17:49 1 0 1 0 
    2 2016-11-10 05:17:49 1 0 1 0 

Iはすでに各ラインを分割し、文字列配列の各列を格納し、行によってファイル全体の行を読み取る機能を有しています。

Dim strEmpFileName As String 
Dim strBackSlash As String 
Dim intEmpFileNbr As Integer 

Dim strLine As String 
Dim strSplit1() As String 
Dim strSplit2() As String 
Dim attRecord(0 To 99, 0 To 30, 0 To 3) As String 

strBackSlash = IIf(Right$(App.Path, 1) = "\", "", "\") 
strEmpFileName = App.Path & strBackSlash & "1_attlog.dat" 
intEmpFileNbr = FreeFile 

Open strEmpFileName For Input As #intEmpFileNbr 

Do Until EOF(intEmpFileNbr) 
    Input #intEmpFileNbr, strLine 
    strSplit1() = Split(strLine, vbTab) 
    strSplit2() = Split(strSplit1(1)) '<-- separate date and time (space delimited) 
    Print strSplit1(0); Tab(5); strSplit2(0); Tab(18); strSplit2(1) 
    'Shows: 1 2016-11-09 08:03:51 
Loop 
Close #intEmpFileNbr 

私の問題は、以下のような3次元配列に値を保存したかったということです。 VB6が限界ですので、私はこのために別の言語を使用することはできません。

3 dimensional array: (user# upto 99, days of the month (31), 4 timestamp per day) 

1 -> 2016-11-01 -> {08:03:51, 11:22:00, 13:29:06, 05:17:49} 
    2016-11-02 -> {07:55:25, 11:30:07, 13:45:11, 05:05:12} 
     upto 
    2016-11-30 -> {08:15:23, 11:25:45, 13:23:02, 05:00:57} 

2 -> 2016-11-01 -> {08:03:51, 11:22:00, 13:29:06, 05:17:49} 
    2016-11-02 -> {07:55:25, 11:30:07, 13:45:11, 05:05:12} 
     upto 
    2016-11-30 -> {08:15:23, 11:25:45, 13:23:02, 05:00:57} 

これは、そのユーザーの日付が既に存在するかどうかを知るためにアレイ全体を検索し、その日付の追加のタイムスタンプを追加する必要があると思います。

目標は、日と、ユーザーごとの一日あたりの時間数の数を計算することができることです。

+0

ユーザーIDは、99月の日数に0などの固定数であれば(11月15日は、12月15日と同じであるので、私は、あなたが月に無視すると仮定)30に固定された数0である、あなたはしないでください配列全体をループする必要があります。あなたは2016年11月15日に顧客#20がYourArray(20,15、X)であると仮定できます。この方法では、時間要素Xをループして比較するだけでよい。 – George

答えて

0

これを行うにはいくつかの方法があります。次のいずれかを実行できます

。最初に行を並べ替えます。これにより、自動的にグループ化されます。その後、結果をループしてカウントします。

b。再帰的に。配列のデータ構造をツリーに変更します。各ユーザーにはノードがあり、それは子供たちが日になり、子供たちは時間になります。

このようなデータ構造をポピュレートするための一般的な再帰的な解決策はDictonaryオブジェクト(あなたは、Microsoftスクリプトランタイム参照を含める必要があります)を使用することである:このサブへの着信値を変換追記よう

Private Sub AddItem(ByRef oDict As Dictionary, ParamArray vItems() As Variant) 
    Dim vItem As Variant 
    Dim oThisDict As Dictionary 
    Dim oNewDict As Dictionary 

    Set oThisDict = oDict 
    For Each vItem In vItems 
     If oThisDict.Exists(vItem) Then 
      Set oThisDict = oThisDict(CStr(vItem)) 
     Else 
      Set oNewDict = New Dictionary 
      oThisDict.Add CStr(vItem), oNewDict 
      Set oThisDict = oNewDict 
     End If 
    Next 
End Sub 

を文字列。

Dim oDict As New Dictionary 

AddItem oDict, strSplit1(0), strSplit2(0), strSplit2(1) 

あなたは、ファイルの各行のAddItemメソッドの呼び出しを実行します。

は、次のようなこのような構造のものを取り込むことができます。あなたは、単に一例に使用することができます終わり

:あなたは、ユーザーがわからない場合

debug.print oDict.Item("1").Count 

は、ユーザ1の日付の数のカウントを取得するには、その後のことができます。oDictをループ。キーの集まり:

Dim vUser As Variant 

For Each vUser In oDict.Keys 
    Debug.Print vUser 
Next 

うまくいけば、残りの部分を解決するのに十分です。ディクショナリオブジェクトはVariant型で動作することに注意してください。

+0

私は実際にあなたが提案したものを試しました。それが機能していますが、途中で発生する他の問題にはまだまだ取り組んでいます。だから私はPHPを使用して終了し、完全に行われています。しかし、私はまだあなたの答えを受け入れるつもりです。ありがとう。 – Harris

関連する問題