03-29-2012 10:23 AM
I would like to view only the rows in which the data in column x is some particular value.
For instance, I'd like to view (and create a group of channels) containing only data from rows where the text in column 2 is MC1.
... guess I can't put a picture inline...
See attached for sample data.
Thanks.
03-29-2012 09:51 PM
Hi ebloohm,
If you'll post or email (brad.turpin@ni.com) an example data set, I'll send you code that does the row filtering.
Brad Turpin
DIAdem Product Support Engineer
National Instruments
03-29-2012 11:31 PM
Thanks Brad.
Will the screenshot of the data from the previous post work?
If not, I can send you a portion of the actual data file.
03-30-2012 06:37 AM
Hi ebloohm,
No, I can't test my script with your screenshot.
Brad Turpin
DIAdem Product Support Engineer
National Instruments
03-30-2012 09:08 AM
OK. A small sample is attached. The original file is about 1 1/2 million rows.
04-03-2012 10:16 AM
Hi ebloohm,
This script will break out your loaded data rows by the "Station" channel values. let me know if you want to filter out the "1;2" suffix or leave it differentiated. If you want to do the same sort of thing not within a single file but across multiple files, then you'd do better to change your DataPlugin to enable the DataFinder to pull only the desired rows from each file.
OPTION EXPLICIT Dim i, j, iMax, jMax, RawGroup, Channel, IdChName, OrderChName, Msg, LastTime Dim IdChDict, IdChannel, OrderChannel, RowDict, RowKeys, RowItems, DataChDict IdChName = "Station" OrderChName = "" ' "Time" or "" Set RawGroup = Data.Root.ChannelGroups(GroupCount) On Error Resume Next Set OrderChannel = RawGroup.Channels(OrderChName) On Error Goto 0 Set IdChDict = CreateObject("Scripting.Dictionary") Set IdChannel = RawGroup.Channels.Add(IdChName, DataTypeString) IdChDict.Add UCase(IdChannel.Name), IdChannel Set Channel = RawGroup.Channels(IdChName) : IdChDict.Add UCase(Channel.Name), Channel jMax = RawGroup.Channels.Count-1 Set DataChDict = CreateObject("Scripting.Dictionary") IF IsObject(OrderChannel) THEN DataChDict.Add UCase(OrderChannel.Name), OrderChannel END IF FOR j = 1 TO jMax Set Channel = RawGroup.Channels(j) IF NOT IdChDict.Exists(UCase(Channel.Name)) AND UCase(Channel.Name) <> UCase(OrderChName) THEN DataChDict.Add UCase(Channel.Name), Channel END IF NEXT ' j Msg = "Enumerating all the Groups..." Call MsgBoxDisp(Msg, "MB_NOBUTTON", "MsgTypeNote", 0, 0, 1) Call CreateIdChannel(IdChDict) Set RowDict = EnumerateIdRows(IdChannel) RowKeys = RowDict.Keys RowItems = RowDict.Items iMax = UBound(RowKeys) LastTime = Timer FOR i = 0 TO iMax IF Timer > LastTime+1 OR Timer < LastTime THEN Msg = "Sort Extracting Group " & i+1 & " of " & iMax+1 Call MsgBoxDisp(Msg, "MB_NOBUTTON", "MsgTypeNote", 0, 0, 1) LastTime = Timer END IF Call ExtractIdGroup(RowKeys(i), RowItems(i), IdChDict, DataChDict) NEXT ' i Call RawGroup.Channels.Remove(IdChannel.Name) Call MsgBoxCancel Sub TextToNumeric(Group, ChanName, ChanType, Factor, Offset) Dim RawChannel, NewChannel Set RawChannel = Group.Channels(ChanName) Set NewChannel = Group.Channels.Add("New|" & ChanName, ChanType) L1 = RawChannel.Properties("Number").Value L2 = NewChannel.Properties("Number").Value ChnLength(L2) = ChnLength(L1) Call ChnCalculate("Ch(L2) = CDbl(Ch(L1))") IF Factor <> 1 OR Offset <> 0 THEN Call ChnLinScale(NewChannel, NewChannel, Factor, Offset) END IF Call ChnMove(NewChannel, RawGroup.Properties("Index").Value, RawChannel.Properties("GroupIndex").Value) Call RawGroup.Channels.Remove(RawChannel.Name) NewChannel.Name = Mid(NewChannel.Name, 5) End Sub ' TextToNumeric() Sub CreateIdChannel(IdChDict) Dim j, jMax, RawGroup, ChListStr, IdChannels, IdChannel IdChannels = IdChDict.Items Set IdChannel = IdChannels(0) Set RawGroup = IdChannel.ChannelGroup Call RawGroup.Activate ChListStr = "" jMax = UBound(IdChannels) FOR j = 1 TO jMax ChListStr = ChListStr & "Ch(" & IdChannels(j).Properties("Number").Value & ") & ""."" & " NEXT ' IdCh ChListStr = Left(ChListStr, Len(ChListStr)-9) Call ChnCalculate("Ch(" & IdChannel.Properties("Number").Value & ") = " & ChListStr) End Sub ' CreateIdChannel() Function EnumerateIdRows(IdChannel) Dim j, jMax, RawGroup, RawChannel, RawChnStr, RowDict, StartRow, StopRow, RowMax Set RawGroup = IdChannel.ChannelGroup Call RawGroup.Activate RawChnStr = "" jMax = RawGroup.Channels.Count-1 FOR j = 1 TO jMax Set RawChannel = RawGroup.Channels(j) RawChnStr = ChnStrAdd(RawChnStr, RawChannel.Properties("Number").Value) NEXT ' j Call ChnMultipleSort(IdChannel, RawChnStr, 0, 1) L3 = IdChannel.Properties("Number").Value Set RowDict = CreateObject("Scripting.Dictionary") StartRow = 1 StopRow = 1 RowMax = ChnLength(L3) Do While StopRow <= RowMax T1 = ChT(StartRow, L3) StopRow = ChnFind("UCase(Ch(L3)) <> UCase(T1)", StartRow+1) IF StopRow = 0 THEN StopRow = CLng(RowMax+1) RowDict.Add T1, StartRow & "|" & CLng(StopRow-StartRow) StartRow = CLng(StopRow) Loop ' Until End Of Channel L3 Set EnumerateIdRows = RowDict End Function ' EnumerateIdRows() Function ExtractIdGroup(RowKey, RowItem, IdChDict, DataChDict) Dim j, jMax, RawGroup, RawChannel, NewGroup, NewChannel, RawChnStr, NewChnStr, DataChannels, Cols Dim StartRow, RowCount, NewDataType, NewDataDisp, NewOrderCh, IdChannels, IdChannel, OrderChannel Cols = Split("|" & RowItem, "|") IF UBound(Cols) < 2 THEN Exit Function StartRow = CLng(Cols(1)) RowCount = CLng(Cols(2)) IF Data.Root.ChannelGroups.Exists(RowKey) THEN Call Data.Root.ChannelGroups.Remove(RowKey) Set NewGroup = Data.Root.ChannelGroups.Add(RowKey) Call NewGroup.Activate IdChannels = IdChDict.Items jMax = UBound(IdChannels) FOR j = 1 TO jMax Set IdChannel = IdChannels(j) NewGroup.Properties.Add IdChannel.Name, ChV(StartRow, IdChannel.Properties("Number").Value) NEXT ' j RawChnStr = "" NewChnStr = "" DataChannels = DataChDict.Items jMax = UBound(DataChannels) FOR j = 0 TO jMax Set RawChannel = DataChannels(j) Set NewChannel = NewGroup.Channels.Add(RawChannel.Name, RawChannel.DataType) ChnLength(NewChannel) = RowCount RawChnStr = ChnStrAdd(RawChnStr, RawChannel.Properties("Number").Value) NewChnStr = ChnStrAdd(NewChnStr, NewChannel.Properties("Number").Value) NEXT ' j Call DataBlCopy(RawChnStr, StartRow, RowCount, NewChnStr, 1) NewChannel = "" On Error Resume Next Set NewChannel = NewGroup.Channels("Value") On Error Goto 0 IF OrderChName <> "" THEN NewChnStr = "" jMax = UBound(DataChannels) Set OrderChannel = NewGroup.Channels(DataChannels(0).Name) FOR j = 1 TO jMax Set NewChannel = NewGroup.Channels(DataChannels(j).Name) NewChnStr = ChnStrAdd(NewChnStr, NewChannel.Properties("Number").Value) NEXT ' j Call ChnMultipleSort(OrderChannel, NewChnStr, 0, 1) END IF ' can order the rows of each extracted Group Set ExtractIdGroup = NewGroup End Function ' ExtractIdGroup()
Brad Turpin
DIAdem Product Support Engineer
National Instruments
04-04-2012 08:40 AM
Thank you.
07-16-2014 05:05 AM
Hello,
even if this topic is already a while ago this pretty looks atfter what i need.
But i have a few issues about the script from Brad_Trupin.
-Where in the script and how can i pretend according to which row (value) is filtered (so not for all row(values) will be filtered and created a group)
or even better after more pretende row values will be filtered (like in excel)
-How can i manage it that the filtered channels are not sorted (or sorted by time-channel/chronologically)
Thanks a lot
07-17-2014 09:55 AM
hello AndiMEC,
i'm not sure i understand what you're asking. say you have a column of numeric data, and you want to filter the data to show only numbers < 10. would like you like to filter it further or for it to maintain the original row placement? please clarify what you mean.
07-17-2014 10:53 AM
Hello,
i juat want to get the same as in the script of Brad_Trupin is done only a bit modifyed.
Example i have 5 text channels and i want to filter them (like in exel), one channel includes the values M1, M2, M3 ,M4, and i want to filter after e.g M1 AND M3 (like in excel)
And how do i get it that the result channels aren't sorted (like in the original channel)