2009-04-22 8 views
7

हम grep, cut, sort, uniq का उपयोग करते हैं, और डेटा विश्लेषण करने के लिए हर समय कमांड लाइन में शामिल होते हैं। वे महान काम करते हैं, हालांकि कमियां हैं। उदाहरण के लिए, आपको प्रत्येक टूल में कॉलम नंबर देना होगा। हमारे पास अक्सर व्यापक फ़ाइलें (कई कॉलम) और कॉलम हेडर होता है जो कॉलम नाम देता है। वास्तव में, हमारी फाइलें एसक्यूएल टेबल की तरह दिखती हैं। मुझे यकीन है कि एक ड्राइवर (ओडीबीसी?) है जो सीमित टेक्स्ट फ़ाइलों पर काम करेगा, और कुछ क्वेरी इंजन जो उस ड्राइवर का उपयोग करेंगे, इसलिए हम केवल हमारी टेक्स्ट फ़ाइलों पर SQL क्वेरी का उपयोग कर सकते हैं। चूंकि विश्लेषण करना आमतौर पर विज्ञापन होता है, इसलिए कुछ कॉन्फ़िगरेशन में विशेष तालिकाओं को घोषित करने के बजाय नई फाइलों (केवल इस निर्देशिका में निर्दिष्ट फ़ाइलों का उपयोग करने के लिए) को न्यूनतम सेटअप करना होगा।एसक्यूएल क्वेरी इंजन?

व्यावहारिक रूप से बोलना, सबसे आसान क्या है? यही है, एसक्यूएल इंजन और ड्राइवर जो पाठ फ़ाइलों के खिलाफ आवेदन करने के लिए सेट अप और उपयोग करने के लिए सबसे आसान है?

उत्तर

3

किसी और का सुझाव बंद riffing, यहाँ sqlite3 के लिए एक अजगर स्क्रिप्ट है। एक छोटी verbose, लेकिन यह काम करता है।

मैं पूरी तरह से शीर्ष लेख पंक्ति पर फ़ाइल की प्रतिलिपि करने के लिए पसंद नहीं है, लेकिन मैं और कैसे sqlite3 के .import को समझाने के लिए इसे छोड़ करने के लिए पता नहीं है। मैं INSERT कथन बना सकता था, लेकिन यह बदतर नहीं होने पर उतना ही बुरा लगता है।

नमूना मंगलाचरण:

 
$ sql.py --file foo --sql "select count(*) from data" 

कोड:

 
#!/usr/bin/env python 

"""Run a SQL statement on a text file""" 

import os 
import sys 
import getopt 
import tempfile 
import re 

class Usage(Exception): 
    def __init__(self, msg): 
     self.msg = msg 

def runCmd(cmd): 
    if os.system(cmd): 
     print "Error running " + cmd 
     sys.exit(1) 
     # TODO(dan): Return actual exit code 

def usage(): 
    print >>sys.stderr, "Usage: sql.py --file file --sql sql" 

def main(argv=None): 
    if argv is None: 
     argv = sys.argv 

    try: 
     try: 
      opts, args = getopt.getopt(argv[1:], "h", 
             ["help", "file=", "sql="]) 
     except getopt.error, msg: 
      raise Usage(msg) 
    except Usage, err: 
     print >>sys.stderr, err.msg 
     print >>sys.stderr, "for help use --help" 
     return 2 

    filename = None 
    sql = None 
    for o, a in opts: 
     if o in ("-h", "--help"): 
      usage() 
      return 0 
     elif o in ("--file"): 
      filename = a 
     elif o in ("--sql"): 
      sql = a 
     else: 
      print "Found unexpected option " + o 

    if not filename: 
     print >>sys.stderr, "Must give --file" 
     sys.exit(1) 
    if not sql: 
     print >>sys.stderr, "Must give --sql" 
     sys.exit(1) 

    # Get the first line of the file to make a CREATE statement 
    # 
    # Copy the rest of the lines into a new file (datafile) so that 
    # sqlite3 can import data without header. If sqlite3 could skip 
    # the first line with .import, this copy would be unnecessary. 
    foo = open(filename) 
    datafile = tempfile.NamedTemporaryFile() 
    first = True 
    for line in foo.readlines(): 
     if first: 
      headers = line.rstrip().split() 
      first = False 
     else: 
      print >>datafile, line, 
    datafile.flush() 
    #print datafile.name 
    #runCmd("cat %s" % datafile.name) 
    # Create columns with NUMERIC affinity so that if they are numbers, 
    # SQL queries will treat them as such. 
    create_statement = "CREATE TABLE data (" + ",".join(
     map(lambda x: "`%s` NUMERIC" % x, headers)) + ");" 

    cmdfile = tempfile.NamedTemporaryFile() 
    #print cmdfile.name 
    print >>cmdfile,create_statement 
    print >>cmdfile,".separator ' '" 
    print >>cmdfile,".import '" + datafile.name + "' data" 
    print >>cmdfile, sql + ";" 
    cmdfile.flush() 
    #runCmd("cat %s" % cmdfile.name) 
    runCmd("cat %s | sqlite3" % cmdfile.name) 

if __name__ == "__main__": 
    sys.exit(main()) 
+0

कूल, धन्यवाद dfrankow! – mcassano

2

MySQL में CVS storage engine है, जो आपकी आवश्यकताएं हो सकती हैं, यदि आपकी फ़ाइलें CSV फ़ाइलें हैं।

अन्यथा, आप mysqlimport का उपयोग MySQL में पाठ फ़ाइलें आयात कर सकते हैं। आप mysqlimport के चारों ओर एक रैपर बना सकते हैं, जो कॉलम इत्यादि का आंकड़ा करता है और आवश्यक तालिका बनाता है।

तुम भी DBD::AnyData, एक पर्ल मॉड्यूल आप का उपयोग पाठ फ़ाइलों की सुविधा देता है जो एक डेटाबेस की तरह उपयोग करने में सक्षम हो सकता है।

जिसके अनुसार, यह आप की तरह एक बहुत वास्तव में एक डेटाबेस का उपयोग पर गौर करना चाहिए लगता है। टेक्स्ट फ़ाइलों में टेबल उन्मुख डेटा को रखना वास्तव में आसान है?

+0

हाँ, यह वास्तव में आसान रखते हुए तालिका उन्मुख पाठ फ़ाइलों में डेटा।यह हमारे द्वारा बनाई गई सभी कमांड लाइन आंकड़ों के साथ संयुक्त है, इस डेटा को ले लो, इसमें शामिल हों, उसमें शामिल हों, कुछ कॉलम काट दें, इसे एनोवा के माध्यम से पास करें। हमारे आंकड़े औजारों को प्राप्त करने के लिए हर समय टेबल सेट करना, आयात करना और निर्यात करना दर्दनाक होगा। – dfrankow

+0

सहमत हैं, यहां मुद्दा यह है कि मैं कई अलग-अलग स्रोतों से डेटा का उपयोग करता हूं और आम माध्यम आमतौर पर एक सफेद-स्पेस से अलग फ़ाइल होती है। यदि मैं स्पष्टता के लिए, कॉलम संख्या के बजाय फ़ील्ड नाम 'कट' दे सकता हूं तो मेरा काम आसान होगा। पांच मिनट बाद मुझे उस फाइल के साथ किया गया है जो mysql को आयात करता है जो बोझिल लगता है। – mcassano

3

हो सकता है कि एक स्क्रिप्ट है कि एक SQLite उदाहरण (संभवतः स्मृति में) बनाता है, एक फ़ाइल/stdin से आयात अपने डेटा (अपने डेटा के प्रारूप को स्वीकार करने) लिखते हैं,, एक प्रश्न चलाता है तो बाहर निकल जाता है?

डेटा की मात्रा पर निर्भर करता है, प्रदर्शन स्वीकार्य हो सकता है।

+0

बदसूरत, लेकिन पहली बात जो मेरे दिमाग में आई थी। प्रोटोटाइपिंग और छोटी नौकरियों के लिए निश्चित रूप से काफी अच्छा है। – dmckee

5

David Malcolm जो आप SQL जैसी कमान का उपयोग करने की अनुमति देता है "squeal" (पूर्व में "शो") नाम की एक छोटी सी उपकरण, लिखा था सीएसवी समेत विभिन्न प्रारूपों की पाठ फ़ाइलों को पार्स करने के लिए लाइन सिंटैक्स।

चिल्लाहट के मुख पृष्ठ पर एक उदाहरण:

$ squeal "count(*)", source from /var/log/messages* group by source order by "count(*)" desc 
count(*)|source    | 
--------+--------------------+ 
1633 |kernel    | 
1324 |NetworkManager  | 
98  |ntpd    | 
70  |avahi-daemon  | 
63  |dhclient   | 
48  |setroubleshoot  | 
39  |dnsmasq    | 
29  |nm-system-settings | 
27  |bluetoothd   | 
14  |/usr/sbin/gpm  | 
13  |acpid    | 
10  |init    | 
9  |pcscd    | 
9  |pulseaudio   | 
6  |gnome-keyring-ask | 
6  |gnome-keyring-daemon| 
6  |gnome-session  | 
6  |rsyslogd   | 
5  |rpc.statd   | 
4  |vpnc    | 
3  |gdm-session-worker | 
2  |auditd    | 
2  |console-kit-daemon | 
2  |libvirtd   | 
2  |rpcbind    | 
1  |nm-dispatcher.action| 
1  |restorecond   | 
0

मैं माइक्रोसॉफ्ट LogParser का इस्तेमाल किया है क्वेरी करने के लिए सीएसवी कई बार फाइल ... और यह उद्देश्य कार्य करता है। एम $ से इतना उपयोगी टूल देखना बहुत ही आश्चर्यजनक था!

+0

शायद एक टिप्पणी। टिप्पणी के लिए उत्तर ब्लॉक का उपयोग करने से बचें। – Luv

+0

प्रश्न लिनक्स के लिए था, एक एमएस उपकरण संभवतः वाई/ओ वाइन (और शायद एक जीयूआई) काम नहीं करेगा। – David

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^