Page 2 of 2

Re: How to, correctly open a file, on a specific column.?

Posted: Thu Dec 20, 2018 4:04 am
by TI-994A
dcr3 wrote:

Code: Select all

;Therefore TI-994A, you haven't granted me anything. :cry: 
The solutions being offered here are mainly based on guesswork, as you've not outlined your requirements clearly. Nevertheless, here's a modification of my earlier example, with added functionalities.

You'd be able to populate & clear the columns of a list gadget independently, and even clear or replace any single cell by clicking on it and specifying the column and new value, while maintaining the individual column count.

Code: Select all

#listCount = 30
Global Dim listColumnData.s(#listCount, 1)
#listIconGadgetColumn1 = 0
#listIconGadgetColumn2 = 1
#listIconGadget = 8
#column1Count = 6
#column2Count = 7

Procedure countColumnItems(column)   
  columnCount = 0
  For item = 0 To ArraySize(listColumnData())    
    If Trim(listColumnData(item, column)) <> ""
      columnCount + 1
    EndIf
  Next item
  ProcedureReturn columnCount
EndProcedure

Procedure updateColumnCount() 
  column = #listIconGadgetColumn1
  For gadget = #column1Count To #column2Count    
    SetGadgetText(gadget, 
                  "RemainingItems: " + 
                  Str(CountColumnItems(column)))
    column + 1
  Next gadget
EndProcedure

Procedure updateListGadget(stage = 1) 
  ClearGadgetItems(#listIconGadget)
  Select stage
    Case 1      
      For i = 0 To ArraySize(listColumnData())
        AddGadgetItem(#listIconGadget, -1, 
                      listColumnData(i, #listIconGadgetColumn1) + 
                      #LF$ + listColumnData(i, #listIconGadgetColumn2))       
      Next i  
    Case 2
      FreeArray(listColumnData())
      Global Dim listColumnData.s(#listCount, 1)
  EndSelect
  updateColumnCount()
EndProcedure

Procedure removeListColumn(column)
  For i = 0 To #listCount - 1
    listColumnData(i, column) = ""
  Next i
  updateListGadget(1)  
EndProcedure

Procedure removeListItem(row, column)
  listColumnData(row, column - 1) = ""  
  updateListGadget()  
EndProcedure

Procedure replaceListItem(row, column, newColumnValue.s)
  listColumnData(row, column - 1) = newColumnValue
  updateListGadget()    
EndProcedure

Procedure populateList(forColumn)    
  For item = 0 To #listCount - 1
    listColumnData(item, forColumn) = "Column " + Str(forColumn + 1) + ": " + Str(item + 1)
  Next item
  updateListGadget()    
  MessageRequester("Click To Modify", "Left Click on the list item to remove, or" + #CRLF$ +
                                      "Right Click on the list item to replace.")  
EndProcedure

OpenWindow(0, 0, 0, 340, 700, "Multi-Column Handler",
           #PB_Window_SystemMenu | 
           #PB_Window_MinimizeGadget | 
           #PB_Window_ScreenCentered)
ButtonGadget(1, 30, 10, 135, 20, "Fill Column 1")
ButtonGadget(2, 175, 10, 135, 20, "Fill Column 2")
ButtonGadget(3, 30, 70, 280, 20, "Clear List")
ButtonGadget(4, 30, 40, 135, 20, "Clear Column 1")
ButtonGadget(5, 175, 40, 135, 20, "Clear Column 2")
TextGadget(#column1Count, 30, 660, 135, 25, "", #PB_Text_Border)
TextGadget(#column2Count, 175, 660, 135, 25, "", #PB_Text_Border)
ListIconGadget(#listIconGadget, 30, 100, 280, 550, "Column 1", 140,
               #PB_ListIcon_GridLines | 
               #PB_ListIcon_FullRowSelect)
AddGadgetColumn(#listIconGadget, 1, "Column 2", 140)

Repeat
  Select WaitWindowEvent()      
    Case #PB_Event_CloseWindow
      appQuit = 1      
    Case #PB_Event_Gadget      
      Select EventGadget()                    
        Case 1
          populateList(#listIconGadgetColumn1)          
        Case 2
          populateList(#listIconGadgetColumn2)          
        Case 3
          updateListGadget(2)
        Case 4, 5
          column = EventGadget() - 4
          removeListColumn(column)
        Case #listIconGadget
          If EventType() = #PB_EventType_LeftClick
            row = GetGadgetState(#listIconGadget)
            column = Val(InputRequester("Remove List Item:", 
                                        "Remove Row " + Str(row + 1) + 
                                        ", Column 1 or 2?", ""))
            If column => 1 And column <= 2 And 
              row >= 0 And row <= ArraySize(listColumnData())                            
              removeListItem(row, column)
            EndIf
          ElseIf EventType() = #PB_EventType_RightClick            
            row = GetGadgetState(#listIconGadget)
            column = Val(InputRequester("Replace List Item:", 
                                        "Replace Row " + Str(row + 1) + 
                                        ", Column 1 or 2?", ""))
            If column => 1 And column <= 2 And 
               row >= 0 And row <= ArraySize(listColumnData())                            
              newColumnValue.s = InputRequester("Replace List Item:", 
                                                "New cell value:", "")
              replaceListItem(row, column, newColumnValue)
            EndIf            
          EndIf          
      EndSelect      
  EndSelect
Until appQuit
A Q&D solution, but it works. :wink:

Re: How to, correctly open a file, on a specific column.?

Posted: Thu Dec 20, 2018 7:29 am
by RASHAD
Not tested enough
- Add
- Delete
- Clear

Code: Select all

Global NewList a$(),NewList b$(),item1,item2

Procedure removeitem(row,col)
  If col = 0
    item1 = 0
    ResetList(a$())
    *Result  = SelectElement(a$(), row)
    ChangeCurrentElement(a$(), *Result)
    DeleteElement(a$())
    ResetList(a$())
    While NextElement(a$())
      SetGadgetItemText(3,item1,a$(),0)
      item1 + 1
    Wend    
  Else
    item2 = 0
    ResetList(b$())
    *Result  = SelectElement(b$(), row)
    ChangeCurrentElement(b$(), *Result)
    DeleteElement(b$())
    ResetList(b$())
    While NextElement(b$())
      SetGadgetItemText(3,item2,b$(),1)
      item2 + 1
    Wend
  EndIf
EndProcedure

Procedure additem(row,col,text$)
  If col = 0
    item1 = 0
    ResetList(a$())
    *Result  = SelectElement(a$(), row)
    ChangeCurrentElement(a$(), *Result)
    InsertElement(a$())
    a$() = text$
    ResetList(a$())
    While NextElement(a$())
      SetGadgetItemText(3,item1,a$(),0)
      item1 + 1
    Wend    
  Else
    item2 = 0
    *Result  = SelectElement(b$(), row)
    ChangeCurrentElement(b$(), *Result)
    InsertElement(b$())
    b$() = text$
    ResetList(b$())
    While NextElement(b$())
      SetGadgetItemText(3,item2,b$(),1)
      item2 + 1
    Wend
  EndIf
EndProcedure

Procedure emptylist(file)
  If file = 0
    ClearList(a$())
    For item = 0 To item1
      SetGadgetItemText(3,item,"",0)
    Next
  ElseIf file = 1 
    ClearList(b$())
    For item = 0 To item2
      SetGadgetItemText(3,item,"",1)
    Next
  EndIf
EndProcedure

flg= #PB_Window_SystemMenu |#PB_Window_MinimizeGadget| #PB_Window_ScreenCentered
   OpenWindow(0,0,0,240,600,"Open File 2nd Col",flg)
   ButtonGadget(1, 10, 10, 70, 20, "OpenFile #1")
   ButtonGadget(2, 85, 10, 70, 20, "OpenFile #2")
   ButtonGadget(4, 160, 10, 70, 20,"Edit")
   ListIconGadget(3, 10, 40, 220, 550,"Col1",95,#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect)
   AddGadgetColumn(3, 1, "Col2",95)
   For i = 0 To 100   
      AddGadgetItem(3,-1,"")
   Next
   OpenWindow(1,0,0,200,170,"Edit",#PB_Window_SystemMenu |#PB_Window_Invisible| #PB_Window_WindowCentered,WindowID(0))
   TextGadget(10,10,12,40,20,"File :")
   StringGadget(11,40,10,20,20,"",#PB_String_Numeric)
   CheckBoxGadget(20,10,40,60,20,"Clear")   
   CheckBoxGadget(30,10,60,40,20,"Add")
   TextGadget(31,58,63,40,20,"Row")
   StringGadget(32,85,60,40,20,"",#PB_String_Numeric)
   TextGadget(33,55,87,40,20,"Text")
   StringGadget(34,85,85,100,20,"")
   CheckBoxGadget(40,10,110,40,20,"Delete")
   TextGadget(41,58,113,120,20,"Row ")
   StringGadget(42,85,110,40,20,"",#PB_String_Numeric)
   ButtonGadget(50,10,140,60,20,"RUN")
   ButtonGadget(51,125,140,60,20,"END")
Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      AppQuit = 1
     
    Case #PB_Event_Gadget
     
      Select EventGadget()
         
      Case 1  ;Open File 1         
      file1.s = OpenFileRequester("Open File","","Text (*.txt)|*.txt",1)
      If FileSize(file1) > 0
        item1 = 0
        OpenFile(1, file1)       
        While Eof(1) = 0
          AddElement(a$())
          a$() = ReadString(1)
        Wend
        CloseFile(1)
        ResetList(a$())
        While NextElement(a$())
          SetGadgetItemText(3,item1,a$(),0)
          item1 + 1
        Wend
      EndIf     
     
    Case 2   ;Open File 2     
      file2.s = OpenFileRequester("Open File","","Text (*.txt)|*.txt",1)
      If FileSize(file2) > 0
        item2 = 0
        OpenFile(2,file2)     
        While Eof(2)=0           
          AddElement(b$())
          b$() = ReadString(2)
        Wend
        CloseFile(2)
        ResetList(b$())
        While NextElement(b$())
          SetGadgetItemText(3,item2,b$(),1)
          item2 + 1
        Wend
      EndIf    
     
    Case 4
      HideWindow(1,0)
      
    Case 50
      If GetGadgetText(11) = "1" And ListSize(a$()) > 0
        ok = 1 : file = 0
      ElseIf GetGadgetText(11) = "2" And ListSize(b$()) > 0
        ok = 1 : file = 1
      Else
        ok = 0
        MessageRequester("Error","No loaded file",#MB_OK|#MB_ICONERROR)
      EndIf
      If ok = 1 And GetGadgetState(20) = 1
        emptylist(file)
      EndIf
      If ok = 1 And GetGadgetState(30) = 1
        additem(Val(GetGadgetText(32)),file,GetGadgetText(34))
      EndIf
      If ok = 1 And GetGadgetState(40) = 1
        removeitem(Val(GetGadgetText(32)),file)
      EndIf
      ok = 0 
      SetGadgetState(20,0) : SetGadgetState(30,0) : SetGadgetState(40,0)
      SetGadgetText(11,"")
      SetGadgetText(32,"")
      SetGadgetText(34,"")
      SetGadgetText(42,"")

    Case 51
      HideWindow(1,1)
       
      EndSelect

  EndSelect
Until AppQuit
Edit : Modified

Re: How to, correctly open a file, on a specific column.?

Posted: Thu Dec 20, 2018 1:34 pm
by dcr3
Thank you for bearing with me.
Sorry if I upset anyone.

Perhaps I should have spelled my intension's from the outset.

I have four master list files all in plain text Encoded UTF-8.
all in varies sizes.

One master list from source A.
One master list from source B.
One master list from source C.
One master list from source D.


Then I have secondary list's also all in plain text Encoded UTF-8.
all in varies sizes.

All I wanted was to compare the, secondary list's, with each Master List,discard
all the one's, that are same, on the secondary list and keep the differences.

In the end of day, I just want to find out which source is the most reliable.

Sources files from A,B,C,D. Are preserved list files, they can't be altered, these
are only discarded if unreliable. After some time.

I hope, this makes more sense.

From Papala, second code, I can open the list's irrespective of size,in each column,
the only trouble I was having, was properly clearing the columns for the next input.

Re: How to, correctly open a file, on a specific column.?

Posted: Thu Dec 20, 2018 6:31 pm
by TI-994A
dcr3 wrote:I have four master list files all in plain text Encoded UTF-8.
all in varies sizes.

One master list from source A.
One master list from source B.
One master list from source C.
One master list from source D.

Then I have secondary list's also all in plain text Encoded UTF-8.
all in varies sizes.

All I wanted was to compare the, secondary list's, with each Master List,discard
all the one's, that are same, on the secondary list and keep the differences.


In the end of day, I just want to find out which source is the most reliable.

Sources files from A,B,C,D. Are preserved list files, they can't be altered, these
are only discarded if unreliable. After some time.
If I've understood correctly, this should do the trick:
1. it loads files independently into the first and second columns of a list gadget
2. the contents of the two columns are automatically compared for differences
3. the resulting differences are displayed in the third column of the list gadget
4. the results can optionally show the differences from just one or both files
5. the display shows the live entry counts in each column
6. differing & variable-sized files are accommodated automatically
7. the third column results can be optionally saved into a separate file
8. sample data provided for testing convenience

Code: Select all

Enumeration
  #listIconGadgetColumn1
  #listIconGadgetColumn2
  #listIconGadgetColumn3
  #simulateFileData = 5
  #showDiffInBoth
  #column1Count
  #column2Count
  #column3Count
  #listIconGadget  
EndEnumeration

#listCount = 30
Global Dim listColumnData.s(#listCount, 2)
Global secondFileName.s = GetHomeDirectory() + "/simData.txt"

Procedure clearColumnData(column)
  For i = 0 To ArraySize(listColumnData())
    listColumnData(i, column) = ""  
  Next i  
EndProcedure

Procedure countColumnItems(column)   
  columnCount = 0
  For item = 0 To ArraySize(listColumnData())    
    If Trim(listColumnData(item, column)) <> ""
      columnCount + 1
    EndIf
  Next item
  ProcedureReturn columnCount
EndProcedure

Procedure updateColumnCount() 
  column = #listIconGadgetColumn1
  For gadget = #column1Count To #column3Count    
    SetGadgetText(gadget, "Column Count: " + Str(CountColumnItems(column)))
    column + 1
  Next gadget
EndProcedure

Procedure updateListGadget(stage = 1) 
  ClearGadgetItems(#listIconGadget)
  Select stage
    Case 1      
      For i = 0 To ArraySize(listColumnData())
        AddGadgetItem(#listIconGadget, -1, 
                      listColumnData(i, #listIconGadgetColumn1) + 
                      #LF$ + listColumnData(i, #listIconGadgetColumn2) +
                      #LF$ + listColumnData(i, #listIconGadgetColumn3))       
      Next i  
    Case 2
      FreeArray(listColumnData())
      Global Dim listColumnData.s(#listCount, 2)
  EndSelect
  updateColumnCount()
EndProcedure

Procedure compareColumnData() 
  reverseComparison = #True
  For i = 0 To ArraySize(listColumnData())
    noMatch = #True
    For ii = 0 To ArraySize(listColumnData())
      If listColumnData(i, #listIconGadgetColumn2) = listColumnData(ii, #listIconGadgetColumn1)        
        noMatch = #False        
        Break
      EndIf
    Next ii        
    If noMatch = #True And Trim(listColumnData(i, #listIconGadgetColumn2)) <> ""
      listColumnData(row3count, 2) = listColumnData(i, #listIconGadgetColumn2)
      row3count + 1
      If row3count > ArraySize(listColumnData())
        reverseComparison = #False        
        Break
      EndIf
    EndIf   
  Next i     
  
  If reverseComparison And (GetGadgetState(#showDiffInBoth) = #PB_Checkbox_Checked)
    For i = 0 To ArraySize(listColumnData())
      noMatch = #True
      For ii = 0 To ArraySize(listColumnData())
        If listColumnData(i, #listIconGadgetColumn1) = listColumnData(ii, #listIconGadgetColumn2)        
          noMatch = #False        
          Break
        EndIf
      Next ii        
      If noMatch = #True And Trim(listColumnData(i, #listIconGadgetColumn1)) <> ""
        listColumnData(row3count, 2) = listColumnData(i, #listIconGadgetColumn1)
        row3count + 1
        If row3count > ArraySize(listColumnData())
          listColumnData(row3count - 1, 2) = "more differences..."
          Break
        EndIf
      EndIf   
    Next i
  EndIf
  
EndProcedure

Procedure populateList(forColumn)    
  clearColumnData(forColumn)
  clearColumnData(#listIconGadgetColumn3)  
  For item = 0 To #listCount - 1
    diffString$ = ""
    If forColumn = #listIconGadgetColumn2 And (Mod(item, 6) = 0)
      diffString$ = " - is different"
    EndIf    
    listColumnData(item, forColumn) = "File Content " + Str(item + 1) + diffString$
  Next item
  compareColumnData()
  updateListGadget()    
EndProcedure

Procedure populateListFromFile(forColumn)  
  
  If GetGadgetState(#simulateFileData) = #PB_Checkbox_Checked
    populateList(forColumn)    
  Else  
    
    Dim fileRead.s(1000)
    file.s = OpenFileRequester("Open File", "", "Text (*.txt)|*.txt", 1)  
    If file <> ""    
      If forColumn = #listIconGadgetColumn2
        secondFileName = file
      EndIf    
      clearColumnData(forColumn)
      clearColumnData(#listIconGadgetColumn3)
      item = 0 
      fileNum = OpenFile(#PB_Any, file)  
      While Not Eof(fileNum)
        fileRead(item) = ReadString(fileNum)
        item + 1
      Wend         
      CloseFile(fileNum)  
      readCount = item - 1
      
      If readCount > ArraySize(listColumnData())
        Dim tempArray.s(#listCount, 2)
        CopyArray(listColumnData(), tempArray())
        Global Dim listColumnData.s(readCount, 2)
        For i = 0 To ArraySize(tempArray(), 1)
          For ii = 0 To ArraySize(tempArray(), 2)
            listColumnData(i, ii) = tempArray(i, ii)
          Next ii        
        Next i        
      EndIf      
      
      For item = 0 To readCount
        listColumnData(item, forColumn) = fileRead(item)
      Next item
      
      compareColumnData()
      updateListGadget()    
      
    EndIf         
  EndIf  
EndProcedure

OpenWindow(0, 0, 0, 500, 730, "File Comparator",
           #PB_Window_SystemMenu | 
           #PB_Window_MinimizeGadget | 
           #PB_Window_ScreenCentered)
ButtonGadget(1, 10, 40, 160, 30, "Load Master File")
ButtonGadget(2, 170, 40, 160, 30, "Load Secondary File")
ButtonGadget(3, 330, 40, 160, 30, "Save Results")
ButtonGadget(4, 10, 75, 480, 30, "Clear All Lists")
CheckBoxGadget(#simulateFileData, 10, 10, 240, 30, 
               "Check this box to simulate file data")
CheckBoxGadget(#showDiffInBoth, 280, 10, 240, 30, 
               "Show differences in both files")
TextGadget(#column1Count, 10, 690, 160, 25, "", #PB_Text_Border)
TextGadget(#column2Count, 170, 690, 160, 25, "", #PB_Text_Border)
TextGadget(#column3Count, 330, 690, 160, 25, "", #PB_Text_Border)
ListIconGadget(#listIconGadget, 10, 110, 480, 570, "Master File Contents", 160,
               #PB_ListIcon_GridLines | 
               #PB_ListIcon_FullRowSelect)
AddGadgetColumn(#listIconGadget, 1, "Secondary File Contents", 160)
AddGadgetColumn(#listIconGadget, 2, "Results (Differences)", 160)

Repeat
  Select WaitWindowEvent()      
    Case #PB_Event_CloseWindow
      appQuit = 1      
    Case #PB_Event_Gadget      
      Select EventGadget()                    
        Case 1
          populateListFromFile(#listIconGadgetColumn1)          
        Case 2
          populateListFromFile(#listIconGadgetColumn2)          
        Case 4
          updateListGadget(2)
        Case 3
          fileName.s = Left(secondFileName, Len(secondFileName) - 4) + "_diff.txt"
          If CreateFile(0, fileName)                     
            For i = 0 To ArraySize(listColumnData())
              diffValue.s = listColumnData(i, 2)
              If diffValue <> ""
                WriteStringN(0, diffValue)
              EndIf
            Next i            
            CloseFile(0)
            RunProgram(fileName)
          EndIf
      EndSelect      
  EndSelect
Until appQuit

Re: How to, correctly open a file, on a specific column.?

Posted: Thu Dec 20, 2018 7:38 pm
by dcr3
Thank you.TI-994A, bless you, and have a peaceful and wonderful days ahead.
To you, and all that belongs to you. vielen herzlichen Dank. :D :D :D

Same to all, that are reading this comment.