This works:
Code: Select all
Delimiter := ";"
Record = "Field1";"Field2";"field1";field1;Field1;"Field6";field1
TempArray := StrSplit(Record, Delimiter, "`t`n`r""""")
duplicates := GetDuplicates(TempArray)
for k, v in duplicates
str .= (str = "" ? "" : "`n") . k . " available in " . v.count . " places! Columns: " . v.pos
MsgBox, % str
GetDuplicates(testArr) {
arr := SortArray(testArr)
duplicates := CSobj()
testItem := arr[1]
Loop % ObjLength(arr) - 1 {
key := RegExReplace(testItem, "\[\d+\]$", "$1")
if !( key == RegExReplace(arr[A_Index + 1], "\[\d+\]$") )
testItem := arr[A_Index + 1]
else {
if !duplicates.HasKey(key)
duplicates[key] := { count: 1, pos: RegExReplace(testItem, ".*\[(\d+)\]$", "$1") }
duplicates[key].count++
duplicates[key].pos .= "," . RegExReplace(arr[A_Index + 1], ".*\[(\d+)\]$", "$1")
}
}
Return duplicates
}
SortArray(testArr) {
StringCaseSense, On
arr := []
for k, v in testArr
arr.Push(v . "[" . k . "]")
length := ObjLength(arr)
Loop % length - 1 {
i := A_Index
Loop % length - i {
if ( RegExReplace(arr[A_Index], "\[\d+\]$") > RegExReplace(arr[A_Index + 1], "\[\d+\]$") ) {
tmp := arr[A_Index + 1]
arr[A_Index + 1] := arr[A_Index]
arr[A_Index] := tmp
}
}
}
Return arr
}
CSobj() {
static base := object("_NewEnum","__NewEnum", "Next","__Next", "__Set","__Setter", "__Get","__Getter", "__Call","__Caller")
return, object("__sd_obj__", ComObjCreate("Scripting.Dictionary"), "base", base)
}
__Getter(self, key) {
return, self.__sd_obj__.item("" key)
}
__Setter(self, key, value) {
self.__sd_obj__.item("" key) := value
return, false
}
__NewEnum(self) {
return, self
}
__Next(self, ByRef key = "", ByRef val = "") {
static Enum
if not Enum
Enum := self.__sd_obj__._NewEnum
if Not Enum[key], val:=self[key]
return, Enum:=false
return, true
}
__Caller(self, name, value) {
if (name = "count")
return, self.__sd_obj__.count
if (name = "HasKey")
return, self.__sd_obj__.Exists(value)
}