text file parsing

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • ghazanfar
    New Member
    • Mar 2007
    • 3

    #1

    text file parsing

    hi,

    i have text file of the form

    atom_trace('emo tion_response_l evel(a1, 1.56072)', emotion_respons e_level(a1, 1.56072), [range(49, 50, true), range(0, 49, unknown)]).

    and

    atom_trace('got o(a1, a3)', goto(a1, a3), [range(1, 51, true), range(0, 1, unknown)]).

    i heve to parse this file . Basically what i required is , i want to extract, emotion response level, range , true and . please tell, how i can parse it.

    awaiting your reply.
    thanks.

    Ghazanfar

    removed
    Last edited by ghazanfar; Mar 14 '07, 12:55 PM. Reason: change
  • bvdet
    Recognized Expert Specialist
    • Oct 2006
    • 2851

    #2
    Originally posted by ghazanfar
    hi,

    i have text file of the form

    atom_trace('emo tion_response_l evel(a1, 1.56072)', emotion_respons e_level(a1, 1.56072), [range(49, 50, true), range(0, 49, unknown)]).

    and

    atom_trace('got o(a1, a3)', goto(a1, a3), [range(1, 51, true), range(0, 1, unknown)]).

    i heve to parse this file . Basically what i required is , i want to extract, emotion response level, range , true and . please tell, how i can parse it.

    awaiting your reply.
    thanks.

    Ghazanfar

    s_ghazanfar@hot mail.com
    We can help you with this, but we need some more information. Can you show us exactly how the data should appear after extraction?
    e.g.:
    Code:
    'emotion_response_level_a1 = 1.56072; range = (49, 50); True'
    Should the data be in a dictionary, list or tuple? What about the other ranges?

    Comment

    • dshimer
      Recognized Expert New Member
      • Dec 2006
      • 136

      #3
      Guys like GhostDog74 and bvdet really give me a clue as to how elementary my understanding of modules really is, so I'd like to take this opportunity to learn something based on how I first approached it.
      In this case my first inclination because the input seems so structured and consistant would be to just grab all the data into a list by replacing all the non data characters with a space then splitting the result, then act on the appropriate index values converting them to numbers or whatever as I go. For example something like
      Code:
      >>> txt="atom_trace('emotion_response_level(a1, 1.56072)', emotion_response_level(a1, 1.56072), [range(49, 50, true), range(0, 49, unknown)])."
      >>> print txt.replace('[',' ').replace(']',' ').replace('(',' ').replace(')',' ').replace(',',' ').replace("'",' ').split()
      ['atom_trace', 'emotion_response_level', 'a1', '1.56072', 'emotion_response_level', 'a1', '1.56072', 'range', '49', '50', 'true', 'range', '0', '49', 'unknown', '.']
      I know there are ways to create multiple replace functions using re, but if that were my only goal (replace stuff with spaces and split, or just split on the non data characters) is there an easier way to do it?

      Comment

      • ghazanfar
        New Member
        • Mar 2007
        • 3

        #4
        text file parsing

        i have text file like this.

        LeadsTo trace
        atom_trace('emo tion_response_l evel(a1, 1.56072)', emotion_respons e_level(a1, 1.76072), [range(49, 50, true), range(0, 49, unknown)]).

        i can describe above line of text in this way:
        a1(agent ) has emotion_respons e_level=1.56072 and that is correspond to range(49,50,tru e), similarly

        a1(agent) has emotion_respons e_level=1.76072 and that is correspond to range(0,49,unkn own), now later on, i have to use in my program that,the agent a1 has emotion_ response_level= 1.56072, because it is true in rage (49,50,true)
        i.e. i have to select the portion related to true range values.
        and then i have also use the vale of range in the program.

        atom_trace('got o(a1, a3)', goto(a1, a3), [range(1, 51, true), range(0, 1, unknown)]).

        atom_trace('age nts_have_conver sation(a1, a3, ajax)', agents_have_con versation(a1, a3, ajax), [range(3, 11, true), range(0, 3, unknown)]).

        ghazanfar

        Comment

        • bartonc
          Recognized Expert Expert
          • Sep 2006
          • 6478

          #5
          Originally posted by ghazanfar
          i have text file like this.

          LeadsTo trace
          atom_trace('emo tion_response_l evel(a1, 1.56072)', emotion_respons e_level(a1, 1.76072), [range(49, 50, true), range(0, 49, unknown)]).

          i can describe above line of text in this way:
          a1(agent ) has emotion_respons e_level=1.56072 and that is correspond to range(49,50,tru e), similarly

          a1(agent) has emotion_respons e_level=1.76072 and that is correspond to range(0,49,unkn own), now later on, i have to use in my program that,the agent a1 has emotion_ response_level= 1.56072, because it is true in rage (49,50,true)
          i.e. i have to select the portion related to true range values.
          and then i have also use the vale of range in the program.

          atom_trace('got o(a1, a3)', goto(a1, a3), [range(1, 51, true), range(0, 1, unknown)]).

          atom_trace('age nts_have_conver sation(a1, a3, ajax)', agents_have_con versation(a1, a3, ajax), [range(3, 11, true), range(0, 3, unknown)]).

          ghazanfar
          Please read the "POSTING GUIDELINES" for this site. Double posting and email address in posts are two things that are not allowed.

          Comment

          • ghostdog74
            Recognized Expert Contributor
            • Apr 2006
            • 511

            #6
            Can you give an exact sample of the input file , and how you want your output to be like. i can't really understand what you are describing.

            Comment

            • ghazanfar
              New Member
              • Mar 2007
              • 3

              #7
              The general format is like

              atom_trace(seed , seed, [range(860.0, 1000, false), range(840.0, 860.0, true), range(580.0, 840.0, false), range(560.0, 580.0, true), range(300.0, 560.0, false), range(280, 300.0, true), range(20, 280, false), range(0, 20, true)]).

              But I required result as I send u.

              Here is the sample.

              atom_trace('emo tion_response_l evel(a1, 1.56072)', emotion_respons e_level(a1, 1.56072), [range(49, 50, true), range(0, 49, unknown)]).

              atom_trace('emo tion_response_l evel(a2, 1.81894)', emotion_respons e_level(a2, 1.81894), [range(49, 50, true), range(0, 49, unknown)]).

              atom_trace('emo tion_response_l evel(a3, 1.51193)', emotion_respons e_level(a3, 1.51193), [range(49, 50, true), range(0, 49, unknown)]).

              atom_trace('emo tion_response_l evel(a1, 1.85)', emotion_respons e_level(a1, 1.85), [range(1, 50, unknown), range(0, 1, true)]).

              atom_trace('emo tion_response_l evel(a2, 1.2)', emotion_respons e_level(a2, 1.2), [range(1, 50, unknown), range(0, 1, true)]).
              atom_trace('emo tion_response_l evel(a3, 0.7)', emotion_respons e_level(a3, 0.7), [range(1, 50, unknown), range(0, 1, true)]).
              atom_trace('emo tion_response_l evel(a1, 1.84775)', emotion_respons e_level(a1, 1.84775), [range(2, 50, unknown), range(1, 2, true), range(0, 1, unknown)]).
              atom_trace('emo tion_response_l evel(a2, 1.39275)', emotion_respons e_level(a2, 1.39275), [range(2, 50, unknown), range(1, 2, true), range(0, 1, unknown)]).
              atom_trace('emo tion_response_l evel(a3, 1.04275)', emotion_respons e_level(a3, 1.04275), [range(2, 50, unknown), range(1, 2, true), range(0, 1, unknown)]).
              atom_trace('has _emotional_valu e(a1, aspect, 1.8)', has_emotional_v alue(a1, aspect, 1.8), [range(3, 50, unknown), range(0, 3, true)]).
              atom_trace('has _emotional_valu e(a3, aspect, 1.8)', has_emotional_v alue(a3, aspect, 1.8), [range(3, 50, unknown), range(0, 3, true)]).


              Ghazanfar

              Comment

              • bvdet
                Recognized Expert Specialist
                • Oct 2006
                • 2851

                #8
                Originally posted by ghazanfar
                The general format is like

                atom_trace(seed , seed, [range(860.0, 1000, false), range(840.0, 860.0, true), range(580.0, 840.0, false), range(560.0, 580.0, true), range(300.0, 560.0, false), range(280, 300.0, true), range(20, 280, false), range(0, 20, true)]).

                But I required result as I send u.

                Here is the sample.

                atom_trace('emo tion_response_l evel(a1, 1.56072)', emotion_respons e_level(a1, 1.56072), [range(49, 50, true), range(0, 49, unknown)]).

                atom_trace('emo tion_response_l evel(a2, 1.81894)', emotion_respons e_level(a2, 1.81894), [range(49, 50, true), range(0, 49, unknown)]).

                atom_trace('emo tion_response_l evel(a3, 1.51193)', emotion_respons e_level(a3, 1.51193), [range(49, 50, true), range(0, 49, unknown)]).

                atom_trace('emo tion_response_l evel(a1, 1.85)', emotion_respons e_level(a1, 1.85), [range(1, 50, unknown), range(0, 1, true)]).

                atom_trace('emo tion_response_l evel(a2, 1.2)', emotion_respons e_level(a2, 1.2), [range(1, 50, unknown), range(0, 1, true)]).
                atom_trace('emo tion_response_l evel(a3, 0.7)', emotion_respons e_level(a3, 0.7), [range(1, 50, unknown), range(0, 1, true)]).
                atom_trace('emo tion_response_l evel(a1, 1.84775)', emotion_respons e_level(a1, 1.84775), [range(2, 50, unknown), range(1, 2, true), range(0, 1, unknown)]).
                atom_trace('emo tion_response_l evel(a2, 1.39275)', emotion_respons e_level(a2, 1.39275), [range(2, 50, unknown), range(1, 2, true), range(0, 1, unknown)]).
                atom_trace('emo tion_response_l evel(a3, 1.04275)', emotion_respons e_level(a3, 1.04275), [range(2, 50, unknown), range(1, 2, true), range(0, 1, unknown)]).
                atom_trace('has _emotional_valu e(a1, aspect, 1.8)', has_emotional_v alue(a1, aspect, 1.8), [range(3, 50, unknown), range(0, 3, true)]).
                atom_trace('has _emotional_valu e(a3, aspect, 1.8)', has_emotional_v alue(a3, aspect, 1.8), [range(3, 50, unknown), range(0, 3, true)]).


                Ghazanfar
                I would suggest creating a dictionary of dictionaries in this format:
                Code:
                {record1: {seed: emotion....., agent: ax, value: x.xxxx, rangeTrue: [low, high], rangeFalse: [low,high]}
                 record2: {....}
                 record3: {....}
                }

                Comment

                • bvdet
                  Recognized Expert Specialist
                  • Oct 2006
                  • 2851

                  #9
                  Since there may be multiple ranges, maybe this format would be better:
                  Code:
                  rec0 = {'ranges': [(49, 50, True), (0, 49, False)], 'seed': 'emotion_response_level', 'value': 1.5607200000000001, 'agent': 'a1'}
                  Sample dictionary listing:
                  Code:
                  rec4: ranges = [(1, 50, False), (0, 1, True)]
                  rec4: seed = emotion_response_level
                  rec4: value = 1.2
                  rec4: agent = a2
                  rec5: ranges = [(1, 50, False), (0, 1, True)]
                  rec5: seed = emotion_response_level
                  rec5: value = 0.7
                  rec5: agent = a3
                  rec6: ranges = [(2, 50, False), (1, 2, True), (0, 1, False)]
                  rec6: seed = emotion_response_level
                  rec6: value = 1.84775
                  rec6: agent = a1

                  Comment

                  • bvdet
                    Recognized Expert Specialist
                    • Oct 2006
                    • 2851

                    #10
                    Originally posted by bvdet
                    Since there may be multiple ranges, maybe this format would be better:
                    Code:
                    rec0 = {'ranges': [(49, 50, True), (0, 49, False)], 'seed': 'emotion_response_level', 'value': 1.5607200000000001, 'agent': 'a1'}
                    Sample dictionary listing:
                    Code:
                    rec4: ranges = [(1, 50, False), (0, 1, True)]
                    rec4: seed = emotion_response_level
                    rec4: value = 1.2
                    rec4: agent = a2
                    rec5: ranges = [(1, 50, False), (0, 1, True)]
                    rec5: seed = emotion_response_level
                    rec5: value = 0.7
                    rec5: agent = a3
                    rec6: ranges = [(2, 50, False), (1, 2, True), (0, 1, False)]
                    rec6: seed = emotion_response_level
                    rec6: value = 1.84775
                    rec6: agent = a1
                    Ghazanfar,

                    Would the data compiled in this format work for you? Are you going to write the code yourself, or do you need help? We are here if you need help.

                    Comment

                    • bvdet
                      Recognized Expert Specialist
                      • Oct 2006
                      • 2851

                      #11
                      I guess ghazanfar solved his problem since he has not been back. For those of you interested, here is the code I came up with:
                      Code:
                      fname = r'your_file'
                      
                      def atomtraceParse(fn):
                          fileList = [x[x.find(")', ")+4:].replace(', aspect', '').strip() for x in open(fn).readlines()]
                          dd = {}
                          cnt = 0
                          for item in fileList:
                              itemList = item.split('), ')
                              a = itemList[0].split('(')
                              a1 = a[1].split(', ')
                              rangeList = [eval(x.strip('[]()').split('(')[1].replace('unknown', 'False').replace('true', 'True')) for x in itemList[1:]]
                              dd['rec'+str(cnt)]=dict(seed=a[0], agent=a1[0], value=float(a1[1]), ranges=[x for x in rangeList])
                              cnt += 1
                          return dd
                      
                      dataDict = atomtraceParse(fname)
                      
                      keys = dataDict.keys()
                      keys.sort()
                      for key in keys:
                          for item in dataDict[key]:
                              print '%s: %s = %s' % (key, item, dataDict[key][item])

                      Comment

                      Working...