سؤال

هل يعرف أي شخص أي أدوات لتوفير استعلامات بسيطة وسريعة للملفات المسطحة باستخدام لغة استعلام تعريفية تشبه SQL؟ أفضل عدم دفع النفقات العامة لتحميل الملف في ديسيبل لأن بيانات الإدخال عادة ما يتم طرحها مباشرة بعد تشغيل الاستعلام.

النظر في ملف البيانات ، "eleusts.txt":

dog 15
cat 20
dog 10
cat 30
dog 5
cat 40

لنفترض أنني أريد استخراج أعلى قيمة لكل حيوان فريد. أود أن أكتب شيئًا مثل:

cat animals.txt | foo "select $1, max(convert($2 using decimal)) group by $1"

يمكنني الحصول على نفس النتيجة تقريبًا باستخدام sort:

cat animals.txt | sort -t " " -k1,1 -k2,2nr

ويمكنني دائما الهبوط في awk من هناك ، لكن كل هذا يشعر قليلاً awkوارد (لم يستطع المقاومة) عندما يبدو أن لغة تشبه SQL تحل المشكلة بشكل نظيف للغاية.

لقد فكرت في كتابة غلاف لـ SQLite من شأنه أن يقوم تلقائيًا بإنشاء جدول بناءً على بيانات الإدخال ، وقد بحثت في استخدام Hive في وضع المعالج الفردي ، لكن لا يسعني إلا أن أشعر أن هذه المشكلة قد تم حلها من قبل. هل فاتني شيء؟ هل تنفذ هذه الوظيفة بالفعل بواسطة أداة قياسية أخرى؟

هطول!

هل كانت مفيدة؟

المحلول 6

لم أتمكن أبدًا من العثور على إجابة مرضية على سؤالي ، لكنني على الأقل أجد حلًا لمشكلة لعبتي باستخدام uniqخيار "-F" ، الذي لم أكن على دراية به:

cat animals.txt | sort -t " " -k1,1 -k2,2nr \
| awk -F' ' '{print $2, " ", $1}' | uniq -f 1

ال awk من الواضح أن الجزء أعلاه يمكن تخطيه بالكامل إذا تم إنشاء ملف الإدخال مع أعمدة بالترتيب المعاكس.

ما زلت أحمل الأمل في أداة تشبه SQL ، رغم ذلك.

نصائح أخرى

كتبت Txtsushi في الغالب للقيام SQL يختار على الملفات المسطحة. فيما يلي سلسلة الأوامر لمثالك (كل هذه الأوامر من Txtsushi):

tabtocsv animals.txt | namecolumns - | tssql -table animals - \
'select col1, max(as_int(col2)) from animals group by col1'

Namecolumns مطلوب فقط لأن الحيوانات. txt ليس لديه صف رأس. يمكنك الحصول على شعور سريع بما هو ممكن من خلال النظر من خلال مثال البرامج النصية. هناك أيضًا روابط لأدوات مماثلة في أسفل الصفحة الرئيسية.

Perl DBI باستخدام DBD :: anydata

يمكنك استخدام sqlite. إليك مثال باستخدام Python.

import sqlite3
conn = sqlite3.connect('/tmp/test.db')
cursor = conn.cursor()
try:
    cursor.execute("""create table table1 (word varchar not null, number varchar not null)""")
except: pass
cursor.execute("insert into table1 values ('dog', '15')")
cursor.execute("insert into table1 values ('cat', '20')")
cursor.execute("insert into table1 values ('dog', '10')")
cursor.execute("select max(number) , word from table1 group by word")
print cursor.fetchall()

انتاج

$ ./python.py
[(u'20', u'cat'), (u'15', u'dog')]

لقد تعثرت للتو عبر هذا السيناريو بيثون وهو ما يفعل شيئًا مثل ما تريده ، على الرغم من أنه يدعم فقط الاستعلامات الأساسية للغاية.

سيكون لدي ORM خفيفة الوزن لـ SQLITE من شأن ذلك تبسيط هذه المهمة دون الحاجة إلى أي ملفات تكوين ، إلخ.

إذا كان بإمكانك استخدام PowerShell الكثير من القدرات القوية لتحليل الملفات النصية والاستعلام عنها (مثال هنا). خلاف ذلك باستخدام .NET/MONO ، يمكنك خفض ذلك واستخدام LINQ في أي وقت من الأوقات.

لقد صنعت أداة قد تساعد.http://www.mccoyonlinestore.com/index.php؟txtsearch=mccoy_rdbmsيمكن أن يكون SQL الخاص بك "SELECT MAX (القيمة) من الحيوانات" أو يمكنه "SELECT * من ترتيب الحيوانات حسب القيمة DESC"

يمكنك البحث عن HXTT JDBC برامج تشغيل. أنها توفر برامج تشغيل JDBC لمعظم أنواع الملفات المسطحة ، Excel وما إلى ذلك.

يمكنك تنفيذ استفسارات SQL البسيطة عليها.

لديهم إصدارات تجريبية متاحة كذلك

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top