使用正则表达式查找重复的gps

时间:2016-03-07 16:02:18

标签: regex csv gps

我使用文本文件,我需要能够查看gps(csv的最后3列)何时“挂起”超过几行。

因此,例如,通常,文本文件的一部分如下所示:

5451,1667,180007,35.7397387,97.8161897,375.8
5448,1053z,180006,35.7397407,97.8161814,375.7
5444,1667,180005,35.7397445,97.8161674,375.6
5439,1668,180004,35.7397483,97.8161526,375.5
5435,1669,180003,35.7397518,97.8161379,375.5
5431,1669,180002,35.7397554,97.8161269,375.6
5426,1054z,180001,35.7397584,97.8161115,375.6
5420,1670,175959,35.7397649,97.8160931,375.9

但有时候gps会出现错误,看起来像这样:

36859,1598,202603.00,35.8867316,99.2515545,555.700
36859,1598,202608.00,35.8867316,99.2515545,555.700
36859,1142z,202610.00,35.8867316,99.2515545,555.700
36859,1597,202612.00,35.8867316,99.2515545,555.700
36859,1597,202614.00,35.8867316,99.2515545,555.700
36859,1596,202616.00,35.8867316,99.2515545,555.700
36859,1595,202618.00,35.8867316,99.2515545,555.700

我需要能够找到一种方法来搜索7个不同数字的匹配字符串(gps的小数部分),但到目前为止我只能弄清楚如何搜索重复#s或连续的数字。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

如果你可以使用 perl ,如果我理解你:

  

perl -ne 'm/^[^,]*,[^,]*,[^,]*,([^,]*,[^,]*,[^,]*$)/g; $current_line=$1; ++$line_number; if ($prev_line==$current_line){$equals++} else {if ($equals>=6){ print "Last three fields in lines ".($line_number-$equals-1)." to ".($line_number-1)." are equals to:\n$prev_line" } ; $equals=0}; $prev_line=$current_line' < onlyreplacethiswithyourfilepath应该可以解决问题。

示例输出:

  

第1行到第7行中的最后三个字段等于:   35.8867316,99.2515545,555.700

     

第16到22行中的最后三个字段等于:   37.8782116,99.7825545,572.810

     

第31到44行中的最后三个字段等于:   36.6868916,77.2594245,581.358

     

第57到63行中的最后三个字段等于:   35.5128764,71.2874545,575.631

答案 1 :(得分:0)

如果要在编辑器(例如Notepad ++)中找到这样的重复,可以使用以下正则表达式来查找4个或更多重复行:

([^,]+(?:,[^,]+){2})\v+(?:(?:[^,]+,){3}\1(?:\v+|$)){3,}

进入细节

  • ([^,]+(?:,[^,]+){2})\v+是一个由一个或多个非逗号后跟逗号和另外一个或多个非逗号后跟一个垂直空格(换行符)的组,该组不属于该组(例如1, 1,1 \ n)的
  • (?:[^,]+,){3}匹配一个或多个非逗号,后跟逗号,三次(您的列不必考虑)
  • \1是对第1组的反向引用,如果它与第1组完全相同则匹配
  • (?:\v+|$)匹配另一个垂直空格或文本末尾
  • {3,}重复3次或更多次 - 如果你想要更多
  • ,请增加它

Here你可以看到,它是如何运作的

但是,如果您使用任何编程语言来检查这一点,我不会走在正则表达式的路径上,因为检查这些重复可以更容易。这是Python中的一个示例,我希望您可以根据自己的需要采用它:

oldcoords = [0,0,0]
lines = [line.rstrip('\n') for line in open(r'C:\temp\gps.csv')]
for line in lines:
    gpscoords = line.split(',')[3:6]
    if gpscoords == oldcoords:
        repetitions += 1
    else:
        oldcoords = gpscoords
        repetitions = 0
    if repetitions == 4: #or however you define more than a few
        print(', '.join(gpscoords) + ' is repeated')