2010-06-03 10 views
1

Je veux insérer des valeurs dans une table, avec une instruction INSERT INTO mais je voudrais utiliser un délimiteur différent (pas une virgule) comment je fais cela?insérer des valeurs avec un délimiteur différent

je ne veux pas utiliser une virgule pour la raison suivante:

les données sont dans ce format:

|something|somethingelse|something3 ,moretextinsamefield| 

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

Quel SGBD utilisez-vous? – Matt

+0

accès actuallllllllllly –

+3

Y a-t-il une raison pour laquelle vous ne voulez pas utiliser une virgule? – FrustratedWithFormsDesigner

Répondre

2

écriture SQL pour faire cela va devenir très compliqué très rapidement, avec un tas de fonctions imbriquées Mid() et InStr(). Au lieu de cela, je le ferais avec une fonction utilisant 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 

Ensuite, dans SQL, vous appelleriez ainsi:

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

Notez que la fonction que j'ai écrit peut être utilisé même quand il y a un nombre variable de sous-parties dans le champ source. C'est-à-dire que si certains ont 4 parties et d'autres 2, cela n'a pas d'importance, car la fonction renvoie Null pour les parties qui ne sont pas présentes.

4

Pourquoi ne pas utiliser la fonction Split qui vous permet de spécifier un séparateur:

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

AJOUT

Voici un exemple de code dans 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

thomas c'est une idée géniale, alors alors comment pourrais-je insérer ces valeurs dans un tableau s'il vous plaît montrez-moi –

+0

désolé, c'est quoi? pouvez-vous me donner un code –

+0

merci thomas u da man –

2

Serait-il plus facile de faire une opération de pré-insertion et de nettoyer les données? Remplacer les | avec ,, et entourer toutes les valeurs entre guillemets (ou quelque chose comme ça)? Sinon, je pense que si vous formatez les données dans un fichier texte, vous pouvez utiliser Access pour importer du texte et spécifier que | est le délimiteur, plutôt que ,.

+0

si je remplace par une virgule alors cela ne préserve pas l'intégrité parce que j'ai un champ qui a une virgule dans la chaîne –

+0

@every_answer_gets_a_point: Si vous citez ce champ, ou échapper la virgule (comme '\,') ça marche pour vous? Les fichiers CSV peuvent avoir des virgules dans les valeurs du champ en mettant simplement des guillemets autour du champ: '" field1 "," field 2, has, a, virgule "' – FrustratedWithFormsDesigner

+0

l'importation d'un fichier n'est pas la bonne solution –

2

Vérifiez cet article: Pipe Delimited File into access database

Essayez ce code.

L'approche est la suivante.

  1. importer les données du fichier texte à une table temporaire (« importation »)
  2. Mise à jour des enregistrements existants dans la table (« Dest ») en se joignant à la table importée et la table existante
  3. Select les enregistrements de la table « importation » qui ne sont pas présents dans le tableau « Dest »
  4. Insérez ces nouveaux enregistrements à la « Dest »

Vous devez modifier les requêtes en par votre structure de table.

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

merci mais c'est trop complexe, je n'ai pas besoin d'importer un fichier –

1

Si vous préférez faire avec une instruction INSERT, il est simple. Appelez le sous-programme comme celui-ci:

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

Décommentez la ligne Exécuter pour faire réellement INSERT au lieu d'afficher la déclaration.

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

Je pense que ma réponse est plus extensible et gère plus de variation dans les données source. –

Questions connexes