सवाल सीएसवी फाइलों में पैटर्न के लिए खोज रहे हैं


मेरे पास file.csv है जो इस तरह दिखता है

4,6,18,23,26
5,12,19,29,31
2,5,13,16,30
9,10,24,27,32
4,5,10,19,22
4,6,8,10,25
2,3,4,25,11

मैं कुछ पैटर्न ढूंढना चाहता हूं और उन्हें एक और लॉग फ़ाइल में सहेजना चाहता हूं file.log और उन्हें पहली फ़ाइल से हटा दें। आदर्श रूप से पर्ल या grep

  • उदाहरण के लिए, यदि x + 1 = x2, 3 की सीमा में, पंक्ति को हटाएं और इसके अस्तित्व को किसी अन्य फ़ाइल में लॉग करें और जहां यह अस्तित्व में है। तो फिर 2,4,5,25,11 से हटा दिया जाएगा file.csv और में file.log मुझे कुछ मिल जाएगा row 7: 2,3,4,25,11 was removed from file.csv। मैं अनुक्रम खोजने की कोशिश कर रहा हूँ

5
2017-08-08 13:31


मूल


क्या आपके पास उस पैटर्न की एक सूची है जिसे आप ढूंढना चाहते हैं या क्या आप पैटर्न को पैटर्न सीखना चाहते हैं? - don.joey
साथ ही, आपका शीर्षक txt फ़ाइलों के बारे में बोलता है, लेकिन सीएसवी फाइलों के बारे में आपका प्रश्न। - don.joey
सीएसवी है पाठ। मैं इसे बहुत ज्यादा विचार नहीं दूंगा, मुझे लगता है कि उसका मतलब यह है कि यह सामान है जिसे आसानी से संसाधित किया जा सकता है; द्विआधारी नहीं - Oli♦
@ don.joey मेरे पास पैटर्न हैं जो मैं देखना चाहता हूं, अगर मशीन सीखना जटिल विषय है, तो मैं इसके बारे में बाद में पूछूंगा, लेकिन अभी मेरे पास मेरे पैटर्न हैं। मैंने शीर्षक संपादित किया - Lynob
@ ओली हां सच, मैंने वैसे भी शीर्षक संपादित किया - Lynob


जवाब:


यदि हम आपकी आवश्यकता का अर्थ यह समझते हैं कि तीसरे क्षेत्र (कॉलम) का मान दूसरे फ़ील्ड (कॉलम) की तुलना में एक होना चाहिए, तो उसके साथ awk आप चीजें कर सकते हैं

awk -F, '
$3==$2+1 {print "row "NR": "$0" was removed from "FILENAME > "file.log"; next}1
' file.csv > newfile.csv

जो आपका निर्माण करेगा file.log निर्दिष्ट और शेष पंक्तियों को लिखने के लिए newfile.csv। आप नाम बदल सकते हैं newfile.csv सेवा मेरे file.csv हटाने के अनुकरण के बाद।


5
2017-08-08 14:37



यह काफी स्मार्ट है। मैं आमतौर पर खत्म हो गया हूँ awk लेकिन यह सिर्फ सादा मेरे लिए नहीं हुआ था। यह दिखाने के लिए अच्छा हो सकता है कि आप एक जानवर में कई पैटर्न (कुछ स्थितियों के साथ) को कैसे जोड़ सकते हैं। - Oli♦
अंत में 1 क्या कर रहा है? - Oli♦
1 यह सब कुछ प्रिंट करने के लिए एक शॉर्टेंड तरीका है newfile (हर पंक्ति जो कि के कारण छोड़ नहीं है next के रूप में मूल्यांकन 1 अर्थात। true, इस प्रकार अजीब की डिफ़ॉल्ट कार्रवाई का आह्वान - जो लाइन को मुद्रित करना है) - steeldriver
हालांकि मैं एक अजगर लड़का हूँ, अजीब के लिए अंगूठे! मैंने पेर्ल समाधान स्वीकार कर लिया क्योंकि मैंने मूल रूप से इसके लिए पूछा था, लेकिन किसी को यह स्वीकार करना होगा कि यह सबसे सुंदर लिपि है - Lynob
कुछ गलत है, स्क्रिप्ट परीक्षण अगर s3 = s2 + 1 .... लेकिन मैं इसे तीसरी पंक्ति तक परीक्षण करना चाहता हूं। मेरा मतलब है कि अगर लगातार 3 संख्याएं हैं तो उन्हें 2 नहीं हटाया जाना चाहिए - Lynob


मुझे लगता है कि इसके लिए आपको एक भारी प्रोग्रामिंग भाषा की आवश्यकता है। पायथन है मेरे पसंद की भाषा इसलिए यहां एक सरल स्क्रिप्ट है जिसमें परीक्षण का एक सरल उदाहरण है:

import sys

tests = [
    lambda a, b, c, d, e: a+1==b and b+1==c and c+1==d and d+1==e,
]

with open(sys.argv[1]) as f:
    for line in f:
        if any(t(*map(int, line.split(','))) for t in tests):
            sys.stderr.write('Line removed: %s\n' % line)
            continue
        print line

यह स्पष्ट रूप से परीक्षणों का एक कंकाल उदाहरण है लेकिन यह प्रयोग योग्य होना चाहिए। सामान्य रूप से चलाएं यह केवल उन लाइनों को आउटपुट करेगा जो STDOUT से मेल नहीं खाते हैं और जो STDERR करते हैं। यह एक नई फाइल में रीडायरेक्ट करने के लिए उपयोगी बनाता है।

यहां यह कार्रवाई में है:

$ python patterns.py <(echo -n 1,2,3,4,5)
Line removed: 1,2,3,4,5

$ python patterns.py <(echo -n 1,2,4,4,5)
1,2,4,4,5

एक बार जब आप पैटर्न के साथ इसे लोड कर लेंगे, तो आप इसे सीएसवी पास कर सकते हैं: python patterns.py input.csv


प्रदर्शन के मामले में, पायथन हमेशा सबसे तेज़ नहीं होता है। मैं इसका उपयोग करें क्योंकि यह वेब विकास के लिए पर्याप्त तेज़ है और लिखने का समय बहुत तेज है (जो मुझे समय / पैसा खर्च करता है)।

आप पीपीपी के साथ चीजों को तेज कर सकते हैं। यह एक वैकल्पिक पायथन रनटाइम है बेंचमार्क आश्चर्यजनक रूप से अच्छी तरह से। आपको पीपीए संस्करण की आवश्यकता नहीं हो सकती है (भरोसेमंद जहाजों 2.2, पीपीए 2.3.1 है) लेकिन यहां आप यह कैसे करेंगे:

sudo add-apt-repository ppa:pypy/ppa
sudo apt-get update
sudo apt-get install pypy

फिर आप अपनी स्क्रिप्ट लॉन्च करेंगे pypy script.py या यदि आप इसे निष्पादित कर रहे हैं तो सीधे खोलने वाले शेबांग को बदलें #!/usr/bin/env pypy। मैंने कुछ किया है बहुत 350000-लाइन इनपुट फ़ाइल पर सरल परीक्षण (आपका उदाहरण 50000 बार दोहराया) उपरोक्त लिपि के साथ।

python2 इसे 1.417 के दशक में चलाया और pypy इसमें भाग गया 0.645s। मेरे अनुभव में, आप अधिक जटिल algos के साथ एक बड़ा सुधार देखने जा रहे हैं।

... लेकिन हाँ, इनमें से कोई भी सी / सी ++ समकक्ष को मारने वाला नहीं है। यदि इसे चलाने में लगने वाला समय धन है, तो इसे एक तेज़ भाषा में पुन: कार्यान्वित करने में कुछ समय व्यतीत करें।


6
2017-08-08 14:08



क्या इसे तेजी से बनाया जा सकता है? कल मैं इसे एक बड़ी फाइल पर कोशिश कर रहा था, यह पर्ल की तुलना में बहुत अधिक समय ले रहा है, जो इसे 3 सेकंड या उससे भी कम समय में करता है - Lynob
अपने परीक्षणों को ऑर्डर करना सबसे अधिक संभावना है कि पहले मदद मिलेगी, लेकिन आप उस बिंदु तक पहुंच जाएंगे जहां पाइथन अन्य भाषाओं के पीछे है ... यह पर्ल की तुलना में धीमी और तेज़ दोनों है (विभिन्न चीजों पर)। आप पापी को आजमा सकते हैं जो हो सकता है काफी तेज डिफ़ॉल्ट पायथन रनटाइम की तुलना में ... लेकिन यदि आप इसे गंभीरता से करना चाहते हैं, तो आप सी / सी ++ में पूरी चीज करेंगे जो इस स्तर पर, यह करना मुश्किल है। - Oli♦


पर्ल:

$ perl -i.bak -F, -ane '
    if ($F[0]+1 == $F[1] and $F[1]+1 == $F[2]) {warn "row $.: $_"} else {print}
' file.csv 2>file.log
$ cat file.log
row 7: 2,3,4,25,11
$ cat file.csv
4,6,18,23,26
5,12,19,29,31
2,5,13,16,30
9,10,24,27,32
4,5,10,19,22
4,6,8,10,25

2
2017-08-08 15:43



अगर मैं इसे script.pl में डालता हूं तो यह केवल टर्मिनल में काम नहीं करेगा - Lynob