توليد إدراج البيانات SQL من ملف CSV
سؤال
أريد أن استيراد ملف csv إلى فايربيرد وقضيت بضع ساعات في محاولة بعض الأدوات لا تناسب احتياجاتي.
المشكلة الرئيسية هي أن كل أدوات لقد كنت أحاول EMS استيراد البيانات و فايربيرد بيانات المعالج نتوقع أن بلدي ملف CSV يحتوي على جميع المعلومات المطلوبة من قبل بلدي الجدول.
أريد أن أكتب بعض SQL مخصص في إدراج البيان ، على سبيل المثال ، لدي ملف CSV مع اسم المدينة, ولكن كما قاعدة البيانات الخاصة بي بالفعل جميع المدن في جدول آخر (تطبيع) ، أريد أن أكتب subselect في إدراج البيان إلى البحث عن المدينة و تكتب ID, كما يجب إجراء مخزن إلى cread GUID.
بلدي insert سيكون شيئا مثل هذا:
INSERT INTO PERSON (ID, NAME, CITY_ID) VALUES((SELECT NEW_GUID FROM CREATE_GUID), :NAME, (SELECT CITY_ID FROM CITY WHERE NAME = :CITY_NAME)
كيف يمكن مقاربة هذا ؟
المحلول
انها قليلا الخام - ولكن واحدة من الوظائف ، وأنا في بعض الأحيان استخدام Excel.
إذا قمت باستيراد ملف CSV في Excel يمكنك إنشاء صيغة مما يخلق INSERT باستخدام سلسلة سلسلة في الصيغة.حتى إذا كان ملف CSV يحتوي على 3 أعمدة التي تظهر في الأعمدة A و B و C في Excel ، يمكن أن تكتب صيغة مثل...
="INSERT INTO MyTable (Col1, Col2, Col3) VALUES (" & A1 & ", " & B1 & ", " & C1 & ")"
ثم يمكنك تكرار الصيغة أسفل كل الصفوف و نسخ و لصق الإجابة في ملف نصي إلى تشغيل قاعدة البيانات الخاصة بك.
كما أقول إنه الخام - ولكن يمكن أن يكون تماما 'سريعة وقذرة طريقة الحصول على وظيفة القيام به!
نصائح أخرى
حسنا, إذا كان CSV, و هذا هو وقت واحد عملية فتح الملف في Excel ثم اكتب الصيغ تعبئة البيانات الخاصة بك في أي بالطريقة التي تريدها ، ثم كتابة بسيطة Concat صيغة لبناء SQL الخاصة بك ، ثم نسخ هذه الصيغة لكل صف.سوف تحصل على عدد كبير من البيانات SQL التي يمكن ان تنفذ في أي مكان تريد.
فابيو ،
لقد فعلت ما Vaibhav فعلت عدة مرات و هو جيد "سريعة وقذرة" طريقة للحصول على البيانات في قاعدة البيانات.
إذا كنت بحاجة إلى القيام بذلك عدة مرات ، أو على بعض نوع من الجدول الزمني ، ثم أكثر موثوقية طريقة لتحميل البيانات CSV "كما هو" إلى عمل الجدول (أنا.هـ customer_dataload) ثم استخدام معيار البيانات SQL لملء الحقول المفقودة.
(أنا لا أعرف فايربيرد الجملة - ولكن شيئا من هذا القبيل...)
UPDATE person
SET id = (SELECT newguid() FROM createguid)
UPDATE person
SET cityid = (SELECT cityid FROM cities WHERE person.cityname = cities.cityname)
الخ.
عادة, انها أسرع بكثير (وأكثر موثوقية) للحصول على البيانات في قاعدة البيانات ومن ثم إصلاح البيانات من محاولة إصلاح البيانات أثناء تحميل.يمكنك أيضا الحصول على الفائدة من المعاملات التي تسمح لك أن الردة إذا كان لا يعمل!!
يمكنك استيراد ملف CSV في الجدول كما هو ، ثم كتابة استعلام SQL الذي يفعل كل التحولات المطلوبة على استيراد الجدول وإدراج النتيجة في الجدول الهدف.
حتى شيء من هذا القبيل:
<(تحميل ملف CSV إلى temp_table - ن ، city_name)>
إدراج في target_table
حدد t.ن ، ج.city_id كما المدينة
من temp_table t والمدن ج
حيث t.city_name = c.city_name
لطيفة نصيحة حول استخدام Excel, ولكن أنا أيضا أقترح الحصول على مريحة مع لغة البرمجة مثل الثعبان, لأن بعض المهام من الأسهل أن مجرد كتابة سريعة بيثون السيناريو للقيام بهذه المهمة من محاولة العثور على وظيفة تحتاج في Excel أو مسبقة الصنع الأداة التي لا وظيفة.
استخدام csv ملف خارجي الجدول.ثم يمكنك استخدام SQL إلى نسخ البيانات من جدول خارجي إلى وجهتك الجدول - مع كل الاحتمالات SQL.انظر http://www.firebirdsql.org/index.php?op=useful&id=netzka
أود أن تفعل هذا مع awk.
على سبيل المثال, إذا كان لديك هذه المعلومات في ملف CSV:
Bob,New York
Jane,San Francisco
Steven,Boston
Marie,Los Angeles
الأمر التالي سوف تعطيك ما تريد تشغيل في نفس الدليل كـ ملف CSV (اسمه name-city.csv
في هذا المثال).
$ awk -F, '{ print "INSERT INTO PERSON (ID, NAME, CITY_ID) VALUES ((SELECT NEW_GUID FROM CREATE_GUID), '\''"$1"'\'', (SELECT CITY_ID FROM CITY WHERE NAME = '\''"$2"'\''))" }' name-city.csv
نوع awk --help
للحصول على مزيد من المعلومات.
انتهيت للتو من هذا VBA السيناريو الذي قد يكون مفيد لهذا الغرض.كل ما ينبغي عليك القيام به هو تغيير Insert إدراج الجدول في السؤال و قائمة الأعمدة (الواضح في نفس تسلسل ظهورها على ملف إكسل).
Function CreateInsertStatement()
'Output file location and start of the insert statement
SQLScript = "C:\Inserts.sql"
cStart = "Insert Into Holidays (HOLIDAY_ID, NAT_HOLDAY_DESC, NAT_HOLDAY_DTE) Values ("
'Open file for output
Open SQLScript For Output As #1
Dim LoopThruRows As Boolean
Dim LoopThruCols As Boolean
nCommit = 1 'Commit Count
nCommitCount = 100 'The number of rows after which a commit is performed
LoopThruRows = True
nRow = 1 'Current row
While LoopThruRows
nRow = nRow + 1 'Start at second row - presuming there are headers
nCol = 1 'Reset the columns
If Cells(nRow, nCol).Value = Empty Then
Print #1, "Commit;"
LoopThruRows = False
Else
If nCommit = nCommitCount Then
Print #1, "Commit;"
nCommit = 1
Else
nCommit = nCommit + 1
End If
cLine = cStart
LoopThruCols = True
While LoopThruCols
If Cells(nRow, nCol).Value = Empty Then
cLine = cLine & ");" 'Close the SQL statement
Print #1, cLine 'Write the line
LoopThruCols = False 'Exit the cols loop
Else
If nCol > 1 Then 'add a preceeding comma for all bar the first column
cLine = cLine & ", "
End If
If Right(Left(Cells(nRow, nCol).Value, 3), 1) = "/" Then 'Format for dates
cLine = cLine & "TO_DATE('" & Cells(nRow, nCol).Value & "', 'dd/mm/yyyy')"
ElseIf IsNumeric(Left(Cells(nRow, nCol).Value, 1)) Then 'Format for numbers
cLine = cLine & Cells(nRow, nCol).Value
Else 'Format for text, including apostrophes
cLine = cLine & "'" & Replace(Cells(nRow, nCol).Value, "'", "''") & "'"
End If
nCol = nCol + 1
End If
Wend
End If
Wend
Close #1
End Function
يمكنك استخدام مجانا csvsql أن تفعل هذا.
- تثبيته باستخدام هذه التعليمات
الآن قم بتشغيل أمر مثل ذلك إلى استيراد البيانات إلى قاعدة البيانات الخاصة بك.مزيد من التفاصيل في الروابط أعلاه, ولكن سيكون شيئا مثل:
csvsql --db firebase:///d=mydb --insert mydata.csv
الأعمال التالية مع sqlite, و هو ما يمكنني استخدام تحويل البيانات إلى صيغة استعلام
csvsql --db sqlite:///dump.db --insert mydata.csv
الخيار 1:1 - هل حاولت IBExert?IBExpert \ Tools \ استيراد البيانات (المحاكمة أو العملاء الإصدار).
الخيار 2:2 - تحميل ملف csv إلى جدول مؤقت مع F_BLOBLOAD.3 - إنشاء إجراء مخزن التي تستخدم 3 وظائف (f_stringlength, f_strcopy, f_MID) عبر كل سلسلة سحب الحقول إلى بناء إدراج الخاص بك في.
الروابط:2: http://freeadhocudf.org/documentation_english/dok_eng_file.html 3: http://freeadhocudf.org/documentation_english/dok_eng_string.html
أداة انا حاولت مؤخرا أن يعمل بشكل رائع جيدا FSQL.
يمكنك كتابة الأمر الاستيراد ، لصقه في FSQL
و استيراد ملف CSV إلى فايربيرد الجدول.