我想插入值到一個表,與INSERT INTO
聲明,但我想使用不同的分隔符(而不是一個逗號)我該如何做?插入不同分隔符的值
我不想使用逗號,原因如下:
數據的格式如下:
|something|somethingelse|something3 ,moretextinsamefield|
field1 = "something"
field2 = "somethingelse"
field3 = "something3 ,something4"
我想插入值到一個表,與INSERT INTO
聲明,但我想使用不同的分隔符(而不是一個逗號)我該如何做?插入不同分隔符的值
我不想使用逗號,原因如下:
數據的格式如下:
|something|somethingelse|something3 ,moretextinsamefield|
field1 = "something"
field2 = "somethingelse"
field3 = "something3 ,something4"
使用一堆嵌套的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。
你爲什麼不使用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
托馬斯這是一個很酷的想法,那麼我將如何將這些值插入表中,請告訴我 – 2010-06-03 17:30:41
抱歉,那是什麼?你可以給我一些代碼 – 2010-06-03 17:33:50
謝謝托馬斯你da man – 2010-06-03 17:50:33
執行預插入操作和清理數據會更容易嗎?用,
替換|
's,然後用引號括起所有的值(或類似的東西)?
如果不是,我認爲如果你在一個文本文件中格式化數據,你可以使用Access來導入文本並指定|
是分隔符,而不是,
。
如果我用逗號代替,那麼將不會保留完整性,因爲我有一個字段中的逗號有一個逗號 – 2010-06-03 17:29:26
@every_answer_gets_a_point:如果你引用該字段或逃脫逗號(如'\,')是否適合你? CSV文件可以在字段值中包含逗號,只需在該字段中加上引號:'「field1」,「field 2,has,a,comma」 – FrustratedWithFormsDesigner 2010-06-03 17:31:16
導入文件不是正確的解決方案 – 2010-06-03 17:31:42
看看這篇文章:Pipe Delimited File into access database
試試這個代碼。
該方法如下。
- 導入從文本文件到一個臨時表(「導入」)
- 更新現有的通過加入進口 表在表(「目的地」)記錄和現有表中的數據
- 選擇從「導入」表,該表是不是在「目的地」表目前 記錄
- 插入這些新記錄到「目的地」
您需要修改查詢,每 您的表結構。
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()
謝謝,但這太複雜了,我不需要導入文件 – 2010-06-03 17:34:23
如果你喜歡用一個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
我認爲我的答案更具可擴展性,並處理源數據中的更多變化。 – 2010-06-03 18:36:46
您正在使用哪些DBMS? – Matt 2010-06-03 17:24:25
訪問actualllllllllllllllll – 2010-06-03 17:25:33
是否有你不想使用逗號的原因? – FrustratedWithFormsDesigner 2010-06-03 17:25:36