基于分隔字段拆分记录,复制其他字段(Filemaker)

时间:2018-03-05 22:05:43

标签: split delimiter filemaker

我正在使用几个大型Filemaker数据库,这些数据库包含20多年来记录的非常脏的数据。不幸的是,每个数据库本质上都是一个单独的平面文件,带有不受控制的文本字段,没有任何类型的验证或值列表。毫不奇怪,不同的用户在很长一段时间内记录某些类型的数据的方式非常不一致(即,输入字段的内容和方式变化很大)。在将数据转换为合理的关系结构之前,我需要清理数据库中的几个重要字段。

一个字段特别包含通常用空格分隔的长字符串。有没有办法根据此字段中的分隔符拆分记录,复制每条记录的所有其他字段?例如,Contents是一个以空格分隔的字段(创建自己的问题,但不在此处),这将是创建单个记录的基础。字段中分隔条目的数量从1到数不等。

enter image description here

会变成:

enter image description here

将一些字段拆分为单个记录是我能够解决几个问题的唯一方法,因为数据输入存在大量不一致,需要解析条目的不同方式进入新的领域。任何帮助,将不胜感激。

2 个答案:

答案 0 :(得分:1)

肯定有办法做到这一点,你需要为它编写一个脚本。

要准备数据,您可以在此字段上执行“替换字段内容”,并使用段落符号替换所有空格。这将使您能够使用FileMaker的值函数来提取值。

脚本应该包含一个外部循环,循环遍历找到的记录集。应对记录进行排序,以便按顺序插入新记录,而不是在找到的集合的末尾插入。

对于每条记录,使用Valuecount函数检查相关字段中的值数。

如果有多个值,请抓取变量中的字段内容并循环遍历值,复制每次迭代的记录,使用Getvalue函数将该字段替换为变量中的当前值索引。在循环结束时减小值索引。

请记住要有循环的退出条件,并且在执行此类操作时始终处理备份。

答案 1 :(得分:0)

这是一种解决方法,但我最终通过将Box_id和Contents字段导出到Excel并运行以下VBA代码找到了更简单的解决方案:

Sub SliceNDice()
Dim objRegex As Object
Dim X
Dim Y
Dim lngRow As Long
Dim lngCnt As Long
Dim tempArr() As String
Dim strArr
Set objRegex = CreateObject("vbscript.regexp")
objRegex.Pattern = "^\s+(.+?)$"
 'Define the range to be analysed
X = Range([a1], Cells(Rows.Count, "b").End(xlUp)).Value2
ReDim Y(1 To 2, 1 To 1000)
For lngRow = 1 To UBound(X, 1)
     'Split each string by ","
    tempArr = Split(X(lngRow, 2), " ")
    For Each strArr In tempArr
        lngCnt = lngCnt + 1
         'Add another 1000 records to resorted array every 1000 records
        If lngCnt Mod 1000 = 0 Then ReDim Preserve Y(1 To 2, 1 To lngCnt + 1000)
        Y(1, lngCnt) = X(lngRow, 1)
        Y(2, lngCnt) = objRegex.Replace(strArr, "$1")
    Next
Next lngRow
 'Dump the re-ordered range to columns C:D
[c1].Resize(lngCnt, 2).Value2 = Application.Transpose(Y)
End Sub

此解决方案已从此previous question修改。