开发者

Mathematica - StringMatch Elements Within a List?

I have a functions that returns cases from a table that match specific strings. Once I get all the cas开发者_如何学编程es that match those strings, I need to search each case (which is its own list) for specific strings and do a Which command. But all I know how to do is turn the whole big list of lists into one string, and then I only get one result (when I need a result for each case).

UC@EncodeTable;

 EncodeTable[id_?PersonnelQ, f___] :=
  Cases[#, 
   x_List /; 
   MemberQ[x, 
   s_String /; 
   StringMatchQ[
    s, ("*ah*" | "*bh*" | "*gh*" | "*kf*" | 
      "*mn*"), IgnoreCase -> True]], {1}] &@
   Cases[MemoizeTable["PersonnelTable.txt"], {_, id, __}]

That function is returning cases from the table

Which[(StringMatchQ[
 ToString@
  EncodeTable[11282], ("*bh*" | "*ah*" | 
   "*gh*" ), IgnoreCase -> True]) == True, 1, 
 (StringMatchQ[
 ToString@
   EncodeTable[11282], ("*bh*" | "*ah*" | 
   "*gh*" ), IgnoreCase -> True]) == False, 0]

That function is SUPPOSED to return a 1 or 0 for each case returned by the first function, but I don't know how to search within lists without making them all one string and return a result for each list.


Well, you probaby want Map, but it's hard to say without seeing what the structure of the data to be operated upon is. Perhaps you can provide an example.

EDIT: In the comment, an example result was given as

dat = {{204424, 11111, SQLDateTime[{1989, 4, 4, 0, 0, 0.}], Null, 
"Parthom, Mary, MP", Null, 4147, 
"T-00010 AH BH UI", {"T-00010 AH BH UI", "M-14007 LL GG", 
 "F-Y3710 AH LL UI GG"}, "REMOVED."}, {2040, 11111, 
SQLDateTime[{1989, 4, 13, 0, 1, 0.}], Null, "KEVIN, Stevens, STK",
 Null, 81238, 
"T-00010 ah gh mn", {"T-00010 mn", "M-00100 dd", "P-02320 sd", 
 "M-14003 ed", "T-Y8800 kf", "kj"}}};

(actually the example had a syntax error so I fixed it in what I hope is the right way).

Now, if I define a function

func = Which[(StringMatchQ[#[[8]], ("*bh*" | "*ah*" | "*gh*"), 
   IgnoreCase -> True]) == True, 1, True, 0] &;

(note the second condition to be matched may be written as True, see the documentation of Which) which does this

func[dat[[1]]]
(*
-> 1
*)

(note that I've slightly changed func from what you have, in order for it to do what I assume you wanted it to actually do). This can then be applied to dat, of which the elements have the form you gave, as follows:

Map[func, dat]

(* -> {1, 1} *) I'm not sure if this is what you want, I did my best guessing.

EDIT2: In response to the comment about the position of the element to be matched being variable, here is one way:

ClearAll[funcel]
funcel[p_String] := 
  Which[StringMatchQ[p, ("*bh*" | "*ah*" | "*gh*"), 
   IgnoreCase -> True], 1, True, 0];
funcel[___] := 0;

ClearAll[func];
func[lst_List] := Which[MemberQ[Map[funcel, lst], 1], 1, True, 0]

so that

Map[func, dat]

gives {1,1}

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜