postgresql تحويل انسخ بعض أعمدة ملف csv إلى جدول




تحويل ملف excel الى vcard (5)

وصلت للتو هنا في السعي للحصول على حل لتحميل مجموعة فرعية فقط من الأعمدة ولكن يبدو أنه غير ممكن. لذا ، استخدم awk (أو cut ) لاستخراج الأعمدة المطلوبة إلى ملف جديد new_file :

$ awk '{print $2, $5, $7, $10}' file > new_file

وتحميل new_file . هل يمكن توجيه الإخراج مباشرة إلى psql :

$ cut -d \  -f 2,5,7,10 file | 
  psql -h host -U user -c "\COPY table(col1,col2,col3,col4) FROM STDIN DELIMITER ' '" database

لدي ملف CSV يحتوي على 10 أعمدة. بعد إنشاء جدول PostgreSQL بأربعة أعمدة ، أريد نسخ بعض الأعمدة العشرة إلى الجدول.

أعمدة جدول CSV الخاص بي تشبه:

x1 x2 x3 x4 x5 x6 x7 x8 x9 x10

يجب أن تكون أعمدة جدول PostgreSQL كما يلي:

x2 x5 x7 x10

Answer #1

لتحميل البيانات من جدول البيانات (Excel أو OpenOffice Calc) إلى postgreSQL:

احفظ صفحة جدول البيانات كملف CSV. الطريقة المفضلة هي فتح جدول البيانات على OpenOffice Calc والقيام بالتوفير. في نافذة "تصدير إلى ملف نصي" ، اختر مجموعة الأحرف ك Unicode (UTF8) ، محدد المجال: "،" ومحدد النص "". سيتم عرض رسالة تفيد بأنه تم حفظ الورقة النشطة فقط. ملاحظة: يجب حفظ هذا الملف في مجلد ولكن ليس على سطح المكتب ، ويجب حفظه بتنسيق UTF8 (يتم تعزيز dagault باستخدام dafault لتشفير UTF8). إذا تم حفظه على سطح المكتب ، فإن postgreSQL سيعطي رسالة "تم رفض الوصول" ولن يتم تحميلها.

في PostgreSQL ، قم بإنشاء جدول فارغ بنفس عدد الأعمدة مثل جدول البيانات.

ملاحظة: في كل عمود ، يجب أن يكون اسم العمود هو نفسه ، يجب أن يكون نوع البيانات هو نفسه. أيضًا ، ضع في اعتبارك طول البيانات التي تتنوع فيها الأحرف مع حقل كافٍ.

ثم على postgreSQL ، على نافذة SQL ، ضع الكود:

copy "ABC". "def" from E'C: \\ tmp \\ blabla.csv 'المحددات' ، 'CSV HEADER؛

ملاحظة: هنا C: \\ tmp هو المجلد حيث يتم حفظ ملف CSV "blabla". "ABC". "def" هو الجدول الذي تم إنشاؤه في postgreSQL حيث "ABC" هو مخطط و "def" هو الجدول الفعلي. ثم نفذ "تنفيذ الاستعلام" عن طريق الضغط على الزر الأخضر في الأعلى. هناك حاجة إلى "CSV HEADER" عندما يكون عنوان CSV متجهًا في بداية كل عمود.

إذا كان كل شيء على ما يرام ، فلن يتم عرض رسالة خطأ وسيتم تحميل بيانات الجدول من ملف CSV في جدول postgreSQL. ولكن إذا كانت هناك رسالة خطأ ، فقم بما يلي:

إذا كانت رسالة الخطأ تقول أن البيانات طويلة جدًا بالنسبة لعمود معين ، فقم بزيادة حجم العمود. هذا يحدث في الغالب على الطابع والطابع المتغير العمود. ثم قم بتشغيل أمر "تنفيذ الاستعلام" مرة أخرى.

إذا كانت رسالة الخطأ تشير إلى أن نوع البيانات لا يتطابق مع عمود معين ، فقم بتغيير نوع البيانات في عمود جدول postgreSQL لمطابقة أحدهما في جدول CSV.

في حالتك ، بعد إنشاء ملف CSV ، قم بحذف الأعمدة غير المرغوب فيها وقم بمطابقة الأعمدة في جدول postgre.


Answer #2

يمكنك أن تأخذ اقتراح جيمس براون أكثر من ذلك ، كل ذلك في سطر واحد:

ملف قراصنة | awk -F '،' '{print $ 2 "،" $ 5 "،" $ 7 "،" $ 10} "| psql -d db -c" \ copy MyTable من STDIN csv header "


Answer #3

يمكنك توفير الأعمدة التي تريد تعبئتها بأمر COPY . مثل ذلك:

\copy your_table (x2,x5,x7,x10) FROM '/path/to/your-file.csv' DELIMITER ',' CSV;

إليك المستند لأمر COPY .


Answer #4

إذا كانت مهمة مخصصة

إنشاء جدول مؤقت مع كافة الأعمدة في ملف الإدخال

create temporary table t (x1 integer, ... , x10 text)

انسخ من الملف إلى:

copy t (x1, ... , x10)
from '/path/to/my_file'
with (format csv)

الآن إدراج في الجدول النهائي من درجة الحرارة:

insert into my_table (x2, x5, x7, x10)
select x2, x5, x7, x10
from t

وإسقاطها:

drop table t

إذا كانت مهمة متكررة

استخدم ملحق file_fdw . بصفتك مستخدمًا متميزًا:

create extension file_fdw;

create server my_csv foreign data wrapper file_fdw;

create foreign table my_csv (
    x1 integer,
    x2 text,
    x3 text
) server my_csv
options (filename '/tmp/my_csv.csv', format 'csv' )
;

حدد منحة تحديد الإذن على الطاولة للمستخدم الذي سيقرأها:

grant select on table my_csv to the_read_user;

ثم عند الضرورة قراءة مباشرة من ملف CSV كما لو كان جدول:

insert into my_table (x2)
select x2
from my_csv
where x1 = 2




etl