CSVSQL(1) csvkit CSVSQL(1)

csvsql - تولید دستورات SQL برای فایل‌های CSV یا اجرای مستقیم آن‌ها روی پایگاه داده

دستورات SQL را برای یک فایل CSV تولید کنید یا آن دستورات را مستقیماً روی یک پایگاه داده اجرا نمایید. در حالت دوم، هم از ایجاد جدول‌ها و هم از درج داده‌ها پشتیبانی می‌شود:

usage: csvsql [-h] [-d DELIMITER] [-t] [-q QUOTECHAR] [-u {0,1,2,3}] [-b]
              [-p ESCAPECHAR] [-z FIELD_SIZE_LIMIT] [-e ENCODING] [-L LOCALE]
              [-S] [--blanks] [--null-value NULL_VALUES [NULL_VALUES ...]]
              [--date-format DATE_FORMAT] [--datetime-format DATETIME_FORMAT]
              [-H] [-K SKIP_LINES] [-v] [-l] [--zero] [-V]
              [-i {firebird,mssql,mysql,oracle,postgresql,sqlite,sybase}]
              [--db CONNECTION_STRING] [--query QUERIES] [--insert]
              [--prefix PREFIX] [--before-insert BEFORE_INSERT]
              [--after-insert AFTER_INSERT] [--tables TABLE_NAMES]
              [--no-constraints] [--unique-constraint UNIQUE_CONSTRAINT]
              [--no-create] [--create-if-not-exists] [--overwrite]
              [--db-schema DB_SCHEMA] [-y SNIFF_LIMIT] [-I]
              [--chunk-size CHUNK_SIZE]
              [FILE [FILE ...]]
تولید دستورات SQL برای یک یا چند فایل CSV، یا اجرای مستقیم آن دستورات
روی یک پایگاه داده، و اجرای یک یا چند پرس‌وجوی SQL.
آرگومان‌های موضعی:
  FILE                  فایل(های) CSV برای پردازش. در صورت عدم ذکر، ورودی را
                        به عنوان داده پایپ‌شده از طریق STDIN می‌پذیرد.
گزینه‌های اختیاری:
  -h, --help            نمایش این پیام راهنما و خروج
  -i {mssql,mysql,oracle,postgresql,sqlite,duckdb,crate,ingres}, --dialect {mssql,mysql,oracle,postgresql,sqlite,duckdb,crate,ingres}
                        گویش SQL برای تولید. نمی‌تواند همراه با --db استفاده شود.
  --db CONNECTION_STRING
                        در صورت وجود، یک رشته اتصال SQLAlchemy برای اجرای
                        مستقیم SQL تولیدشده روی یک پایگاه داده.
  --engine-option ENGINE_OPTION ENGINE_OPTION
                        یک آرگومان کلیدواژه‌ای برای create_engine() در SQLAlchemy،
                        به عنوان یک جفت جداشده با فاصله. این گزینه می‌تواند
                        چندین بار مشخص شود. برای مثال: thick_mode True
  --query QUERIES       اجرای یک یا چند پرس‌وجوی SQL جداشده با --sql-
                        delimiter، و خروجی دادن نتیجه آخرین پرس‌وجو به صورت
                        CSV. مقدار QUERY می‌تواند یک نام فایل باشد. گزینه --query
                        می‌تواند چندین بار مشخص شود.
  --insert              درج داده‌ها درون جدول. نیازمند --db است.
  --prefix PREFIX       افزودن یک عبارت پس از کلیدواژه INSERT، مانند
                        OR IGNORE یا OR REPLACE.
  --before-insert BEFORE_INSERT
                        پیش از دستور INSERT، یک یا چند پرس‌وجوی SQL جداشده
                        با --sql-delimiter را اجرا می‌کند. نیازمند
                        --insert است.
  --after-insert AFTER_INSERT
                        پس از دستور INSERT، یک یا چند پرس‌وجوی SQL جداشده
                        با --sql-delimiter را اجرا می‌کند. نیازمند
                        --insert است.
  --sql-delimiter SQL_DELIMITER
                        جداکننده میان پرس‌وجوهای SQL در --query،
                        --before-insert، و --after-insert.
  --tables TABLE_NAMES  فهرستی از نام‌های جدول‌ها جداشده با کاما برای ایجاد.
                        به طور پیش‌فرض، نام جدول‌ها بر اساس نام فایل‌ها بدون پسوند
                        یا "stdin" نام‌گذاری می‌شوند.
  --no-constraints      تولید یک طرحواره (schema) بدون محدودیت‌های طول یا
                        بررسی‌های null. هنگام نمونه‌برداری از جدول‌های بزرگ مفید است.
  --unique-constraint UNIQUE_CONSTRAINT
                        فهرستی جداشده با کاما از نام ستون‌ها برای قرار گرفتن در
                        یک قید UNIQUE.
  --no-create           صرف‌نظر از ایجاد جدول. نیازمند --insert است.
  --create-if-not-exists
                        ایجاد جدول در صورت عدم وجود، در غیر این صورت ادامه دادن.
                        نیازمند --insert است.
  --overwrite           حذف جدول در صورت وجود قبلی آن. نیازمند
                        --insert است. نمی‌تواند همراه با --no-create استفاده شود.
  --db-schema DB_SCHEMA
                        نام اختیاری طرحواره پایگاه داده (schema) برای ایجاد
                        جدول(ها) در آن.
  -y SNIFF_LIMIT, --snifflimit SNIFF_LIMIT
                        محدود کردن شناسایی گویش CSV به تعداد بایت‌های مشخص‌شده.
                        مقدار "0" را برای غیرفعال کردن کامل شناسایی مشخص کنید،
                        یا "-1" برای بررسی کل فایل.
  -I, --no-inference    غیرفعال کردن استنتاج نوع (و --locale، --date-format،
                        --datetime-format، --no-leading-zeroes) هنگام تحلیل
                        ورودی.
  --chunk-size CHUNK_SIZE
                        اندازه قطعه (chunk) برای درج دسته‌ای در جدول. نیازمند
                        --insert است.
  --min-col-len MIN_COL_LEN
                        حداقل طول ستون‌های متنی.
  --col-len-multiplier COL_LEN_MULTIPLIER
                        ضرب کردن حداکثر طول ستون در این ضریب برای گنجاندن
                        مقادیر بزرگتر در اجراهای بعدی.

همچنین ببینید: آرگومان‌های مشترک همه ابزارها.

برای اطلاعات بیشتر درباره رشته‌های اتصال و گویش‌های پشتیبانی‌شده به مستندات SQLAlchemy مراجعه کنید.

اگر ترجیح می‌دهید گذرواژه خود را در رشته اتصال وارد نکنید، آن را به طور امن در یک فایل گذرواژه PostgreSQL، یک فایل گزینه‌های MySQL یا فایل‌های مشابه برای سایر سیستم‌ها ذخیره نمایید.

نکته:

استفاده از گزینه --query ممکن است باعث گرد شدن اعداد (در Python 2) یا بروز مشکلات ممیز شناور پایتون (در Python 3) شود.

نکته:

اگر فایل CSV با استفاده از in2csv از یک فایل JSON ایجاد شده است، به یاد داشته باشید که ستون‌های SQL را به درستی درون علامت نقل‌قول قرار دهید. برای مثال:
echo '{"a":{"b":"c"},"d":"e"}' | in2csv -f ndjson | csvsql --query 'SELECT "a/b" FROM stdin'

نکته:

ابزارهای جایگزین csvsql شامل q و textql هستند.

تولید یک عبارت در گویش PostgreSQL:

csvsql -i postgresql examples/realdata/FY09_EDU_Recipients_by_State.csv

ایجاد یک جدول و وارد کردن داده‌ها از CSV به طور مستقیم در PostgreSQL:

createdb test
csvsql --db postgresql:///test --tables fy09 --insert examples/realdata/FY09_EDU_Recipients_by_State.csv

برای جدول‌های بزرگ ممکن است پردازش کل جدول امکان‌پذیر نباشد. یک راه‌حل برای این مسئله، تحلیل نمونه‌ای از جدول است. در این حالت، غیرفعال کردن محدودیت‌های طول و بررسی‌های null با استفاده از گزینه --no-constraints می‌تواند مفید باشد:

head -n 20 examples/realdata/FY09_EDU_Recipients_by_State.csv | csvsql --no-constraints --tables fy09

ایجاد جدول‌ها برای تمام فایل‌های CSV موجود در یک دایرکتوری و وارد کردن داده‌های آن فایل‌ها به طور مستقیم در PostgreSQL:

createdb test
csvsql --db postgresql:///test --insert examples/*_converted.csv

اگر آن فایل‌های CSV سربرگ‌های یکسانی داشته باشند، می‌توانید ابتدا با استفاده از csvstack آن‌ها را در یک جدول وارد کنید:

createdb test
csvstack examples/dummy?.csv | csvsql --db postgresql:///test --insert

می‌توانید از csvsql برای پرس‌وجوی "مستقیم" روی یک یا چند فایل CSV استفاده کنید. لطفاً توجه داشته باشید که این کار یک پایگاه داده SQLite در حافظه ایجاد می‌کند، بنابراین چندان سریع نخواهد بود:

csvsql --query  "SELECT m.usda_id, avg(i.sepal_length) AS mean_sepal_length FROM iris AS i JOIN irismeta AS m ON (i.species = m.species) GROUP BY m.species" examples/iris.csv examples/irismeta.csv

گروه‌بندی سطرها بر اساس یک ستون:

csvsql --query "SELECT * FROM 'dummy3' GROUP BY a" examples/dummy3.csv

الحاق دو ستون:

csvsql --query "SELECT a || b FROM 'dummy3'" --no-inference examples/dummy3.csv

اگر ستونی حاوی مقادیر null است، باید از COALESCE برای آن ستون استفاده کنید:

csvsql --query "SELECT a || COALESCE(b, '') FROM 'sort_ints_nulls'" --no-inference examples/sort_ints_nulls.csv

دستور SQL از نوع UPDATE هیچ خروجی‌ای تولید نمی‌کند. به یاد داشته باشید که ستون‌ها و سطرهای مورد نظر خود را با SELECT انتخاب کنید:

csvsql --query "UPDATE 'dummy3' SET a = 'foo'; SELECT * FROM 'dummy3'" examples/dummy3.csv

Christopher Groskopf و مشارکت‌کنندگان

2016, Christopher Groskopf and James McKinney

August 16, 2024 2.2.0