根据分隔字段拆分记录,复制其他字段(Filemaker)
Split record based on delimited field, duplicating other fields (Filemaker)
我正在使用几个大型 Filemaker 数据库,其中包含 20 多年来记录的非常脏的数据。不幸的是,每个数据库本质上都是一个单一的平面文件,其中包含不受控制的文本字段,没有任何类型的验证或值列表。毫不奇怪,不同的用户在这么长的时间跨度内记录某些类型的数据的方式非常不一致(即,输入字段的内容和方式千差万别)。在将数据提取到合理的关系结构之前,我需要清理数据库中的几个重要字段。
一个字段特别包含通常由 space 分隔的长文本字符串。有没有办法根据该字段中的分隔符拆分记录,为每条记录复制所有其他字段?例如,Contents 是一个 space 分隔字段(它会产生自己的问题,但不是重点),它是创建单个记录的基础。字段中分隔条目的数量从一个到数百不等。
会变成:
鉴于数据输入中的大量不一致以及需要解析条目的不同方式,将一些字段拆分为单独的记录是我能够解决几个问题的唯一方法进入新的领域。任何帮助,将不胜感激。
当然有办法,你需要为它写一个脚本。
要准备数据,您可以在此字段上执行替换字段内容并将所有空格替换为段落符号。这将使您能够使用 FileMaker 的值函数来提取值。
脚本应包含一个外部循环,循环遍历找到的记录集。应对记录进行排序,以便按顺序插入新记录,而不是在搜索结果的末尾插入。
对于每条记录,使用 Valuecount 函数检查相关字段的值数量。
如果有多个值,获取变量中的字段内容并循环遍历值,为每次迭代复制记录,使用 Getvalue 函数将字段替换为变量中的当前值索引。在循环结束时递减值索引。
记住要有循环的退出条件,并且在执行此类操作时始终进行备份。
这是一个解决方法,但我最终找到了一个更简单的解决方案,将 Box_id 和内容字段导出到 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, "")
Next
Next lngRow
'Dump the re-ordered range to columns C:D
[c1].Resize(lngCnt, 2).Value2 = Application.Transpose(Y)
End Sub
此解决方案是根据此 previous question 修改的。
我正在使用几个大型 Filemaker 数据库,其中包含 20 多年来记录的非常脏的数据。不幸的是,每个数据库本质上都是一个单一的平面文件,其中包含不受控制的文本字段,没有任何类型的验证或值列表。毫不奇怪,不同的用户在这么长的时间跨度内记录某些类型的数据的方式非常不一致(即,输入字段的内容和方式千差万别)。在将数据提取到合理的关系结构之前,我需要清理数据库中的几个重要字段。
一个字段特别包含通常由 space 分隔的长文本字符串。有没有办法根据该字段中的分隔符拆分记录,为每条记录复制所有其他字段?例如,Contents 是一个 space 分隔字段(它会产生自己的问题,但不是重点),它是创建单个记录的基础。字段中分隔条目的数量从一个到数百不等。
会变成:
鉴于数据输入中的大量不一致以及需要解析条目的不同方式,将一些字段拆分为单独的记录是我能够解决几个问题的唯一方法进入新的领域。任何帮助,将不胜感激。
当然有办法,你需要为它写一个脚本。
要准备数据,您可以在此字段上执行替换字段内容并将所有空格替换为段落符号。这将使您能够使用 FileMaker 的值函数来提取值。
脚本应包含一个外部循环,循环遍历找到的记录集。应对记录进行排序,以便按顺序插入新记录,而不是在搜索结果的末尾插入。
对于每条记录,使用 Valuecount 函数检查相关字段的值数量。
如果有多个值,获取变量中的字段内容并循环遍历值,为每次迭代复制记录,使用 Getvalue 函数将字段替换为变量中的当前值索引。在循环结束时递减值索引。
记住要有循环的退出条件,并且在执行此类操作时始终进行备份。
这是一个解决方法,但我最终找到了一个更简单的解决方案,将 Box_id 和内容字段导出到 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, "")
Next
Next lngRow
'Dump the re-ordered range to columns C:D
[c1].Resize(lngCnt, 2).Value2 = Application.Transpose(Y)
End Sub
此解决方案是根据此 previous question 修改的。