2010-06-03 52 views
1

我想插入值到一個表,與INSERT INTO聲明,但我想使用不同的分隔符(而不是一個逗號)我該如何做?插入不同分隔符的值

我不想使用逗號,原因如下:

數據的格式如下:

|something|somethingelse|something3 ,moretextinsamefield| 

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

您正在使用哪些DBMS? – Matt 2010-06-03 17:24:25

+0

訪問actualllllllllllllllll – 2010-06-03 17:25:33

+3

是否有你不想使用逗號的原因? – FrustratedWithFormsDesigner 2010-06-03 17:25:36

回答

2

使用一堆嵌套的Mid()和InStr()函數編寫SQL來執行此操作將會非常迅速地變得非常複雜。

相反,我會做一個使用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。

4

你爲什麼不使用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 
+0

托馬斯這是一個很酷的想法,那麼我將如何將這些值插入表中,請告訴我 – 2010-06-03 17:30:41

+0

抱歉,那是什麼?你可以給我一些代碼 – 2010-06-03 17:33:50

+0

謝謝托馬斯你da man – 2010-06-03 17:50:33

2

執行預插入操作和清理數據會更容易嗎?用,替換|'s,然後用引號括起所有的值(或類似的東西)?

如果不是,我認爲如果你在一個文本文件中格式化數據,你可以使用Access來導入文本並指定|是分隔符,而不是,

+0

如果我用逗號代替,那麼將不會保留完整性,因爲我有一個字段中的逗號有一個逗號 – 2010-06-03 17:29:26

+0

@every_answer_gets_a_point:如果你引用該字段或逃脫逗號(如'\,')是否適合你? CSV文件可以在字段值中包含逗號,只需在該字段中加上引號:'「field1」,「field 2,has,a,comma」 – FrustratedWithFormsDesigner 2010-06-03 17:31:16

+0

導入文件不是正確的解決方案 – 2010-06-03 17:31:42

2

看看這篇文章:Pipe Delimited File into access database

試試這個代碼。

該方法如下。

  1. 導入從文本文件到一個臨時表(「導入」)
  2. 更新現有的通過加入進口 表在表(「目的地」)記錄和現有表中的數據
  3. 選擇從「導入」表,該表是不是在「目的地」表目前 記錄
  4. 插入這些新記錄到「目的地」

您需要修改查詢,每 您的表結構。

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() 
+0

謝謝,但這太複雜了,我不需要導入文件 – 2010-06-03 17:34:23

1

如果你喜歡用一個INSERT語句來做到這一點,這很簡單。調用子程序這樣的:

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

取消對執行行實際做的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 
+0

我認爲我的答案更具可擴展性,並處理源數據中的更多變化。 – 2010-06-03 18:36:46