60

csvファイルをFirebirdにインポートする必要があり、いくつかのツールを試して数時間過ごしましたが、どれも私のニーズに合いません。

主な問題は、 EMSデータインポートFirebirdデータウィザードなど、私が試しているすべてのツールが、CSVファイルにテーブルに必要なすべての情報が含まれていることを想定していることです。

挿入ステートメントにカスタムSQLを記述する必要があります。たとえば、都市名のCSVファイルがありますが、データベースにはすでに別のテーブル(正規化)にすべての都市があるため、挿入に副選択を書き込む必要があります。都市を検索してそのIDを書き込むステートメント。また、GUIDを読み取るためのストアドプロシージャがあります。

私の挿入ステートメントは次のようになります。

INSERT INTO PERSON (ID, NAME, CITY_ID) VALUES((SELECT NEW_GUID FROM CREATE_GUID), :NAME, (SELECT CITY_ID FROM CITY WHERE NAME = :CITY_NAME)

どうすればこれにアプローチできますか?

4

12 に答える 12

124

少し粗雑ですが、1回限りの仕事では、Excelを使用することがあります。

CSVファイルをExcelにインポートすると、数式で文字列連結を使用してINSERTステートメントを作成する数式を作成できます。つまり、CSVファイルにExcelの列A、B、Cに表示される3つの列がある場合、次のような数式を記述できます...

="INSERT INTO MyTable (Col1, Col2, Col3) VALUES (" & A1 & ", " & B1 & ", " & C1 & ")"

次に、数式をすべての行に複製し、回答をコピーしてテキストファイルに貼り付け、データベースに対して実行できます。

私が言うように-それは粗雑です-しかしそれは仕事を成し遂げるためのかなり「迅速で汚い」方法である可能性があります!

于 2008-08-11T21:07:51.287 に答える
8

それがCSVであり、これが1回限りのプロセスである場合は、Excelでファイルを開き、数式を記述してデータを任意の方法で入力し、単純なConcat数式を記述してSQLを作成します。次に、その式をすべての行にコピーします。必要な場所で実行できる多数のSQLステートメントを取得します。

于 2008-08-11T21:02:14.620 に答える
5

ファビオ、

私はVaibhavが何度も行ったことを行ってきましたが、これはデータをデータベースに取り込むための優れた「迅速で汚い」方法です。

これを数回、またはある種のスケジュールで行う必要がある場合、より信頼性の高い方法は、CSVデータを「そのまま」作業テーブル(つまりcustomer_dataload)にロードし、標準のSQLステートメントを使用してデータを入力することです。欠落しているフィールド。

(Firebirdの構文はわかりませんが、次のようなものです...)

UPDATE person
SET id = (SELECT newguid() FROM createguid)

UPDATE person
SET cityid = (SELECT cityid FROM cities WHERE person.cityname = cities.cityname)

通常、アップロード中にデータを修正しようとするよりも、データベースにデータを取得してからデータを修正する方がはるかに高速(かつ信頼性が高い)です。また、トランザクションの利点を利用して、機能しない場合にロールバックできるようにします。

于 2008-08-11T21:14:21.897 に答える
3

CSVファイルをそのままテーブルにインポートしてから、インポートされたテーブルで必要なすべての変換を実行し、結果をターゲットテーブルに挿入するSQLクエリを作成できます。

だから次のようなもの:

<(CSVファイルをtemp_table --n、city_nameにロードします)>

target_tableに挿入します

都市としてtn、c.city_idを選択します

temp_table tから、都市c

ここで、t.city_name = c.city_name

Excelの使用に関するヒントですが、Pythonのようなスクリプト言語に慣れることをお勧めします。一部のタスクでは、Excelや以前の機能で必要な機能を見つけるよりも、簡単なPythonスクリプトを記述して作業を行う方が簡単だからです。仕事をするツールを作りました。

于 2008-08-11T21:13:51.290 に答える
3

私はawkでこれを行います。

たとえば、CSVファイルにこの情報がある場合:

Bob,New York
Jane,San Francisco
Steven,Boston
Marie,Los Angeles

name-city.csv次のコマンドは、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してください。

于 2008-08-12T02:25:36.200 に答える
2

無料のcsvsqlを使用してこれを行うことができます。

  • これらの手順を使用してインストールします
  • 次のようなコマンドを実行して、データをデータベースにインポートします。詳細は上記のリンクにありますが、次のようになります。

    csvsql --db firebase:///d=mydb --insert mydata.csv

  • 以下はsqliteで動作し、データをクエリしやすい形式に変換するために使用するものです

    csvsql --db sqlite:///dump.db --insert mydata.csv

于 2017-03-06T14:27:13.833 に答える
1

csv ファイルを外部テーブルとして使用します。次に、SQL を使用して外部テーブルから目的のテーブルにデータをコピーできます。SQL のすべての可能性を利用できます。http://www.firebirdsql.org/index.php?op=useful&id=netzkaを参照してください。

于 2011-03-09T16:48:57.303 に答える
1

この目的に便利なこの VBA スクリプトを完成させました。必要なのは、Insert ステートメントを変更して、問題のテーブルと列のリストを含めることです (明らかに、Excel ファイルに表示される順序と同じです)。

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
于 2010-02-05T16:18:41.140 に答える
0

私が最近試したツールで、非常にうまく機能したのはFSQLです。

IMPORT コマンドを作成して貼り付けるとFSQL、CSV ファイルが Firebird テーブルにインポートされます。

于 2010-01-21T16:59:25.647 に答える
0

オプション 1: 1- IBExert を試しましたか? IBExpert \ ツール \ データのインポート (試用版またはカスタマー バージョン)。

オプション 2: 2- CSV ファイルを F_BLOBLOAD を使用して一時テーブルにアップロードします。3- 3 つの関数 (f_stringlength、f_strcopy、f_MID) を使用するストアド プロシージャを作成し、すべての文字列をクロスして、フィールドをプルして INSERT INTO を構築します。

リンク: 2: http://freeadhocudf.org/documentation_english/dok_eng_file.html 3: http://freeadhocudf.org/documentation_english/dok_eng_string.html

于 2011-03-09T15:47:20.020 に答える