Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Parse large text file

Parse large text file

Scheduled Pinned Locked Moved Solved General and Desktop
13 Posts 5 Posters 1.6k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • V VRonin
    28 Feb 2019, 10:49

    Regular expression don't render very well in this forum, see https://pastebin.com/1rDXQtSL

    Source of the regexp for the decimal number: https://www.regular-expressions.info/floatingpoint.html (this is also the answer to @JonB, I don't type, I copy and paste, typing is for smart people)

    J Offline
    J Offline
    JonB
    wrote on 28 Feb 2019, 10:51 last edited by
    #3

    @VRonin How do you type in this answer so fast --- do you have it pre-prepared? :)

    1 Reply Last reply
    1
    • S Offline
      S Offline
      SGaist
      Lifetime Qt Champion
      wrote on 28 Feb 2019, 10:51 last edited by SGaist
      #4

      Hi,

      The expression you are looking for is "X(\\d+(?:\\.\\d+)?) Y(\\d+(?:\\.\\d+)?)".

      You should rather do the rounding with the captured data otherwise you will lose precession.

      You can use the QRegularExpression tool to test your expressions.

      [edit: Fixed RE missing . escaping SGaist]

      Interested in AI ? www.idiap.ch
      Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

      1 Reply Last reply
      5
      • O Offline
        O Offline
        ODБOï
        wrote on 28 Feb 2019, 11:06 last edited by
        #5

        You are awesome guys, thank you so much for quick/complete answers

        1 Reply Last reply
        0
        • S Offline
          S Offline
          SGaist
          Lifetime Qt Champion
          wrote on 28 Feb 2019, 12:40 last edited by SGaist
          #6

          @LeLev take a look again at the expression. I forgot to escape the .. Therefore the expression was "wrong" in the sense that it will also find values like X1231a212.

          Interested in AI ? www.idiap.ch
          Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

          O 1 Reply Last reply 28 Feb 2019, 13:28
          2
          • S SGaist
            28 Feb 2019, 12:40

            @LeLev take a look again at the expression. I forgot to escape the .. Therefore the expression was "wrong" in the sense that it will also find values like X1231a212.

            O Offline
            O Offline
            ODБOï
            wrote on 28 Feb 2019, 13:28 last edited by ODБOï 3 Jan 2019, 08:45
            #7

            @SGaist got it, thank you!

            1 Reply Last reply
            0
            • O Offline
              O Offline
              ODБOï
              wrote on 1 Mar 2019, 08:51 last edited by
              #8

              Hi !
              I have lot of troubles trying to use the tool @SGaist
              suggested to me. I want to edit my QRegularExpression so it also can catch lines where there is only X or only Y

              N9 G40 X411 Y7.62 // capture 
              N3 G40 Y6000 // << capture this also
              N1 G0 X411 Y7.52 // capture
              N3 G40 X-6000 // << capture this also
              
              
              // ...open file 
               const QRegularExpression regx("X([-+]?\\d*\\.?\\d+)\\s+Y([-+]?\\d*\\.?\\d+)");
                  QTextStream in(&file);
              
                  while(!in.atEnd()) {
              
                      QString line = in.readLine();
                      const QRegularExpressionMatch reMatch = regx.match(line);
                      bool iok;
                      if(reMatch.hasMatch()){
              
                          double lx = reMatch.captured(1).toDouble();
                          double ly = reMatch.captured(2).toDouble();
              
                          qDebug()<<"X : " << lx << " ly" << ly;
                    
              //please tell me if there is a more efficient way to get maximum/minimum X  and  maximum/minimum Y in this file, 
                          if(lx<minX)
                              minX=lx;
                          else if (lx>maxX) maxX=lx;
              
                          if(ly<minY)
                              minY=ly;
                          else if (ly>maxY) maxY=ly;
                      }
                  }
              

              My final aim is to get maximum x and y And minimum x and y in the whole file
              Thank you

              K 1 Reply Last reply 1 Mar 2019, 09:11
              0
              • O ODБOï
                1 Mar 2019, 08:51

                Hi !
                I have lot of troubles trying to use the tool @SGaist
                suggested to me. I want to edit my QRegularExpression so it also can catch lines where there is only X or only Y

                N9 G40 X411 Y7.62 // capture 
                N3 G40 Y6000 // << capture this also
                N1 G0 X411 Y7.52 // capture
                N3 G40 X-6000 // << capture this also
                
                
                // ...open file 
                 const QRegularExpression regx("X([-+]?\\d*\\.?\\d+)\\s+Y([-+]?\\d*\\.?\\d+)");
                    QTextStream in(&file);
                
                    while(!in.atEnd()) {
                
                        QString line = in.readLine();
                        const QRegularExpressionMatch reMatch = regx.match(line);
                        bool iok;
                        if(reMatch.hasMatch()){
                
                            double lx = reMatch.captured(1).toDouble();
                            double ly = reMatch.captured(2).toDouble();
                
                            qDebug()<<"X : " << lx << " ly" << ly;
                      
                //please tell me if there is a more efficient way to get maximum/minimum X  and  maximum/minimum Y in this file, 
                            if(lx<minX)
                                minX=lx;
                            else if (lx>maxX) maxX=lx;
                
                            if(ly<minY)
                                minY=ly;
                            else if (ly>maxY) maxY=ly;
                        }
                    }
                

                My final aim is to get maximum x and y And minimum x and y in the whole file
                Thank you

                K Offline
                K Offline
                kshegunov
                Moderators
                wrote on 1 Mar 2019, 09:11 last edited by
                #9

                https://regex101.com/r/n42ANB/1

                When and/or if you use it, you must escape it properly for C++.

                Read and abide by the Qt Code of Conduct

                O 1 Reply Last reply 1 Mar 2019, 09:29
                2
                • K kshegunov
                  1 Mar 2019, 09:11

                  https://regex101.com/r/n42ANB/1

                  When and/or if you use it, you must escape it properly for C++.

                  O Offline
                  O Offline
                  ODБOï
                  wrote on 1 Mar 2019, 09:29 last edited by
                  #10

                  @kshegunov hi
                  thak you.
                  i only doubled the " \ "s

                  // (X(-?\d+(?:\.\d+)?))?\s*(Y(-?\d+(?:\.\d+)?))? 
                   const QRegularExpression regx("(X(-?\\d+(?:\\.\\d+)?))?\\s*(Y(-?\\d+(?:\\.\\d+)?))?");
                  

                  I tested your exemple on regex101.com and it is doind what i need. But in My program i get Zeros only

                  1 Reply Last reply
                  0
                  • V Offline
                    V Offline
                    VRonin
                    wrote on 1 Mar 2019, 10:00 last edited by VRonin 3 Jan 2019, 10:26
                    #11
                    This post is deleted!
                    1 Reply Last reply
                    0
                    • S Offline
                      S Offline
                      SGaist
                      Lifetime Qt Champion
                      wrote on 1 Mar 2019, 10:17 last edited by SGaist 3 Jan 2019, 11:06
                      #12

                      Because you are using way more capturing groups than you need and are not handling the case where there's no capture which is allowed since you make the whole thing optional.

                      What about simplifying things a bit ?

                      const QRegularExpression rx ("(?:[XY](-?\\d+(?:\\.\\d+)?))");
                      
                      while (!in.atEnd()) {
                          QString line = in.readLine();
                          QRegularExpressionMatchIterator iter = re.globalMatch(line);
                          bool ok;
                          while (iter.hasNext()) {
                              QRegularExpressionMatch match = iter.next();
                              double x_or_y = match.captured(1).toDouble(&ok);
                              if (!ok) {
                                     qDebug() << "Failed to convert" << match.captured(1);
                                     continue;
                              }
                              if (match.captured(0).startsWith(QLatin1Char('X')) {
                                    minX = qmin(minX, x_or_y);
                                    maxX = qmax(maxX, x_or_y);
                              } else {
                                    minY = qmin(minY, x_or_Y);
                                    maxY = qmax(maxY, x_or_y);
                              }
                      }
                      

                      [edit: fixed rx, escaping was missing SGaist]

                      Interested in AI ? www.idiap.ch
                      Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                      1 Reply Last reply
                      5
                      • V Offline
                        V Offline
                        VRonin
                        wrote on 1 Mar 2019, 10:30 last edited by VRonin 3 Jan 2019, 11:45
                        #13

                        I'd use:

                        const QRegularExpression regx("(?:([XY])([-+]?\\d*\\.?\\d+))");
                        QTextStream in(&file);
                        while(!in.atEnd()) {
                            QString line = in.readLine();
                            QRegularExpressionMatchIterator iter = re.globalMatch(line);
                            while (iter.hasNext()){
                                const QRegularExpressionMatch reMatch = iter.next();
                                if(reMatch.captured(1).compare(QLatin1String("X"),Qt::CaseInsensitive)==0){ // matched X
                                    const double lx = reMatch.captured(2).toDouble();
                                    qDebug()<<"X : " << lx;
                                    if(lx<minX)
                                        minX=lx;
                                    else if (lx>maxX)
                                        maxX=lx;
                                }
                                else {// matched Y
                                    const double ly = reMatch.captured(2).toDouble();
                                    qDebug() << " ly" << ly;
                                    if(ly<minY)
                                        minY=ly;
                                    else if (ly>maxY)
                                        maxY=ly;
                                }
                            }
                        }
                        
                        1 Reply Last reply
                        4

                        12/13

                        1 Mar 2019, 10:17

                        • Login

                        • Login or register to search.
                        12 out of 13
                        • First post
                          12/13
                          Last post
                        0
                        • Categories
                        • Recent
                        • Tags
                        • Popular
                        • Users
                        • Groups
                        • Search
                        • Get Qt Extensions
                        • Unsolved