سؤال

أريد أن استيراد ملف 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 إلى فايربيرد الجدول.

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