2013-11-27 27 views
1

我正在将sql导入到我的Access数据库中,并且正在将数据解析到正确的表和字段中。我再次转向你们的大师们以帮助解决问题解析Access中的字符串值

其中一个导入的字段包含逗号分隔的值,需要进行分隔。字符串中可能存在1到10个可能的值。

PHO,Rosgen,NRCS,EMAP,T-DL,YSI-DL 

我已经想通了,如果我做的所有值相同的长度(比如4个字符),我可以得到第一,最后和第一逗号之后解析,但似乎无法得到提取的中间值正确。

SELECT Left([FieldForms],InStr([FieldForms],",")-1) AS DEQ_SampleTypeID 
FROM tblSiteVisit 
UNION ALL 
SELECT Mid([FieldForms],InStr([FieldForms],",")+1,4) AS DEQ_SampleTypeID 
FROM tblSiteVisit 
UNION ALL 
SELECT Mid([FieldForms], 11, 4) AS DEQ_SampleTypeID 
FROM tblSiteVisit 
UNION ALL 
SELECT Mid([FieldForms], 16, 4) AS DEQ_SampleTypeID 
FROM tblSiteVisit 
UNION ALL 
SELECT Mid([FieldForms], 21, 4) AS DEQ_SampleTypeID 
FROM tblSiteVisit 
UNION ALL 
SELECT Mid([FieldForms],InStrRev([FieldForms],",")-4,4) AS DEQ_SampleTypeID 
FROM tblSiteVisit 
UNION ALL 
SELECT Right([FieldForms],InStr([FieldForms],",")-1) AS DEQ_SampleTypeID 
FROM tblSiteVisit 

如果我使用InStrRev或右边的功能,我得到重复,如果有比也使用空行的中期功能结果的最大较少。

有没有办法来解析出像这样的字符串,只能从字符串

+0

这将是更容易的IMO与Access VBA过程而不是查询。这对你来说会是一个合适的选择吗? – HansUp

+0

任何可以工作的东西都是一个选项 – pja

+0

'Split(FieldForms,“,”)'会给你一个字符串数组。向数组中的每个项添加一行到目标表。 – HansUp

回答

1

将下面的功能集成到一个模块得到结果:

Function CountCSWords (ByVal S) As Integer 
    ' Counts the words in a string that are separated by commas. 

    Dim WC As Integer, Pos As Integer 
    If VarType(S) <> 8 Or Len(S) = 0 Then 
     CountCSWords = 0 
     Exit Function 
    End If 
    WC = 1 
    Pos = InStr(S, ",") 
    Do While Pos > 0 
     WC = WC + 1 
     Pos = InStr(Pos + 1, S, ",") 
    Loop 
    CountCSWords = WC 
    End Function 

    Function GetCSWord (ByVal S, Indx As Integer) 
    ' Returns the nth word in a specific field. 

    Dim WC As Integer, Count As Integer, SPos As Integer, EPos As Integer 
    WC = CountCSWords(S) 
    If Indx < 1 Or Indx > WC Then 
     GetCSWord = Null 
     Exit Function 
    End If 
    Count = 1 
    SPos = 1 
    For Count = 2 To Indx 
     SPos = InStr(SPos, S, ",") + 1 
    Next Count 
    EPos = InStr(SPos, S, ",") - 1 
    If EPos <= 0 Then EPos = Len(S) 
    GetCSWord = Trim(Mid(S, SPos, EPos - SPos + 1)) 
    End Function 

然后,把一个场在您的查询像这样的:

MyFirstField: GetCSWord([FieldForms],1) 

把另一个像这样:

MySecondField: GetCSWord([FieldForms],2) 

等......尽可能多的你需要。

+0

在我看来,使用[Split()](http://office.microsoft.com/en-ca/access-help/split-function-HA001228911.aspx)函数可以相当简化这段代码。 –

+0

找不到如何在查询中执行此操作。 Split()会创建一个数组。如果你能想出来,发布它! –

+0

不是世界上最好的VBA ...我创建了模块和查询,但它不工作,我似乎已经搞乱了某个地方。我收到关于无效圆括号的错误。你可以给我在SQL查询? – pja

1

这VBA代码在tblSiteVisitFieldForms读取文本值,分割该文本为子,然后存储每个在在一个新行DEQ_SampleTypeID加入tblDestination的子串。

Dim astrItems() As String 
Dim db As DAO.database 
Dim i As Long 
Dim qdf As DAO.QueryDef 
Dim rs As DAO.Recordset 
Dim strInsert As String 

strInsert = "INSERT INTO tblDestination (DEQ_SampleTypeID)" & vbCrLf & _ 
    "VALUES ([array_item]);" 

Set db = CurrentDb 
Set rs = db.OpenRecordset("tblSiteVisit", dbOpenTable, dbOpenSnapshot) 
Set qdf = db.CreateQueryDef(vbNullString, strInsert) 
Do While Not rs.EOF 
    astrItems = Split(rs!FieldForms, ",") 
    For i = 0 To UBound(astrItems) 
     qdf.Parameters("array_item") = astrItems(i) 
     qdf.Execute dbFailOnError 
    Next 
    rs.MoveNext 
Loop 
rs.Close 
Set rs = Nothing 
Set qdf = Nothing 
Set db = Nothing 
+0

我99%确定(总是保持最后1%...),这将只为表中的每个逗号分隔值插入一条新记录。尽管OP发布了一个UNION ALL SQL字符串,但他的文本显示他正在寻找一种方法让每个CSV分解,这告诉我他希望将它们分成单独的**字段**。这比为每个值创建新的**记录**更有意义。 –