вставить значения с другим разделителем - PullRequest
1 голос
/ 03 июня 2010

Я хочу вставить значения в таблицу с помощью оператора INSERT INTO, но я хотел бы использовать другой разделитель (не запятую). Как мне это сделать?

Я не хочу использовать запятую по следующей причине:

данные в этом формате:

|something|somethingelse|something3 ,moretextinsamefield|

field1 = "something"
field2 = "somethingelse"
field3 = "something3 ,something4"

Ответы [ 5 ]

4 голосов
/ 03 июня 2010

Почему бы вам не использовать функцию Split, которая позволяет указывать разделитель:

Dim aValues As Variant
aValues = Split("|something|somethingelse|something3 ,something4", "|")

Сложение

Вот пример кода в VBA.

Public Sub AppendValues()
    Const SOURCE_VALUES = "|something|somethingelse|something3 ,moretextinsamefield|"
    Dim aValues As Variant

    aValues = Split(SOURCE_VALUES, "|")

    Dim oDB As DAO.Database
    Dim oRS As DAO.Recordset

    Set oDB = DBEngine.Workspaces(0).Databases(0)
    Set oRS = oDB.OpenRecordset("Table1", dbOpenTable)

    oRS.AddNew
    oRS("Col1") = aValues(1)
    oRS("Col2") = aValues(2)
    oRS("Col3") = aValues(3)
    oRS.Update

    Set oRS = Nothing
    Set oDB = Nothing
End Sub
2 голосов
/ 03 июня 2010

Написание SQL для этого очень быстро станет очень сложным, с кучей вложенных функций Mid () и InStr ().

Вместо этого я бы сделал это с помощью функции, которая использует Split ().

  Public Function SplitField(varInput As Variant, strDelimiter As String, lngItemRequested As Long) As Variant
    Dim varTemp As Variant
    Dim arrInput() As String

    varTemp = varInput
    If Left(varTemp, 1) = strDelimiter Then
       varTemp = Mid(varTemp, 2)
    End If
    If right(varTemp, 1) = strDelimiter Then
       varTemp = Left(varTemp, Len(varTemp) - 1)
    End If
    arrInput = Split(varTemp, strDelimiter)
    If lngItemRequested - 1 <= UBound(arrInput()) Then
       SplitField = arrInput(lngItemRequested - 1)
       If SplitField = vbNullString Then
          SplitField = Null
       End If
    Else
       SplitField = Null
    End If
  End Function

Тогда в SQL вы бы назвали это так:

  INSERT INTO TargetTable( Field1, Field2, Field3, Field4 )
  SELECT SourceTable.SourceField, SplitField([SourceField],"|",1),
    SplitField([SourceField],"|",2), 
    SplitField([SourceField],"|",3), 
    SplitField([SourceField],"|",4)
  FROM SourceTable

Обратите внимание, что написанную мною функцию можно использовать даже в том случае, если в исходном поле есть переменное число частей. То есть, если у некоторых есть 4 части, а у некоторых 2, это не имеет значения, так как функция возвращает Null для частей, которых там нет.

2 голосов
/ 03 июня 2010

Ознакомьтесь с этой статьей: Файл с разделителями в базе данных

Попробуйте этот код.

Подход описан ниже.

  1. Импорт данных из текстового файла во временную таблицу («Импорт»)
  2. Обновление существующих записей в таблице («Dest») путем присоединения к импортированным таблица и существующая таблица
  3. Выберите записи из таблицы «Импорт», которых нет в таблице «Дест»
  4. Вставьте эти новые записи в 'Dest'

Вам необходимо изменить запросы согласно структура вашей таблицы.

Dim conn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=G:\VBNET\Access\bin\dest.mdb")   
        'Import data to a temporary table   
        Dim cmd As New OleDbCommand("SELECT * INTO [import] FROM [Text;FMT=Delimited;Database=G:\VBNET\Access\bin;Hdr=Yes].[Students.txt]", conn)   
        conn.Open()   
        cmd.ExecuteNonQuery()   
        'Update Existing records 
        Dim updateQuery As String = "UPDATE Dest INNER JOIN Import ON Dest.id = Import.F1 set Dest.Name = Import.F2"  
        Dim queryCmd As New OleDbCommand(updateQuery, conn)   
        queryCmd.ExecuteNonQuery()   

        Dim selectQuery = "select F1, F2, F3 from Import where F1 not in (select Id from Dest) "  
        queryCmd = New OleDbCommand(selectQuery, conn)   
        Dim dataReader As OleDbDataReader   
        dataReader = queryCmd.ExecuteReader()   

        Dim appendrecords As New ArrayList()   
        Dim insertQuery As String   

        While dataReader.Read()   

            Dim F1 As String = dataReader.GetString(0).ToString()   
            Dim F2 As String = dataReader.GetString(1).ToString()   
            Dim F3 As Integer = dataReader.GetInt32(2).ToString()   
            insertQuery = "insert into Dest values ('" & F1 & "', '" & F2 & "', " & F3 & ")"   
            appendrecords.Add(insertQuery)   

        End While   
        dataReader.Close()   

        Dim i As Integer   
        For i = 0 To appendrecords.Count - 1   
            Dim insertCmd As OleDbCommand = New OleDbCommand(appendrecords(i), conn)   
            insertCmd.ExecuteNonQuery()   
        Next 
        conn.Close()  
2 голосов
/ 03 июня 2010

Было бы проще выполнить операцию предварительной вставки и очистить данные? Заменить | на , и заключить все значения в кавычки (или что-то в этом роде)?

Если нет, я думаю, если вы форматируете данные в текстовом файле, вы можете использовать Access для импорта текста и указать, что | является разделителем, а не ,.

1 голос
/ 03 июня 2010

Если вы предпочитаете делать это с помощью оператора INSERT, это просто.Вызовите подпрограмму следующим образом:

Call InsertValues("|something|somethingelse|something3 ,moretextinsamefield|")

Раскомментируйте строку Execute, чтобы фактически выполнить INSERT вместо простого отображения оператора.

Public Sub InsertValues(ByVal pstrInput As String)
Dim i As Integer
Dim strSql As String
Dim strValList As String
Dim varValues As Variant

varValues = Split(pstrInput, "|")

'first and last array members are empty strings; skip them '
For i = 1 To 3
    strValList = strValList & ", " & Chr(34) & varValues(i) & Chr(34)
Next i
'strip off leading comma and space '
strValList = Mid(strValList, 3)
strSql = "INSERT INTO YourTable (field1, field2, field3)" & _
    vbNewLine & "Values (" & strValList & ");"
Debug.Print strSql
'CurrentDb.Execute strSql, dbFailOnError '
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...