在 FoxPro 或 SQL 中将输入字段从文本转换为列

converting input fields from text to columns in FoxPro or SQL

我在 FoxPro 中有一组输入数据。其中一个字段,grp 字段,是一个连接的字符串,

个别部分由竖线符号“|”分隔。以下是它可以采用的值的一些示例:

群:

ddd|1999|O|%

bce|%

aaa|2009|GON|Fixed|big|MAE|1

bbb|PAL|N|Fixed|MAE|1

aaa|SMK|O|Fixed|MAE|1|1

ddd|ERT|O|%

eef|%|N|%

afd|2000|O|%

afd|200907|O|%

swq|%|O|%

%

我想编写一个查询,将上面的数据分离成单独的字段并将它们输出到另一个 sql table,其中分离的决定因素是管道符号。以前两行为例,输出应该是

记录 1:

Field1 = ddd Field2 = 1999 Field3 = O Field4 = %

记录2: Field1 = bce Field2 = % Field3 没有值 Field4 没有值

事先不知道数据中管道符号的最大数量是多少。在上面的例子中,它是 6,在记录 3 和 5 中。

这真的可行吗?

您可以创建游标并使用 'append from' 将数据追加到其中(另一种方法是使用 2 个行,一个用于行,另一个用于列数据)。例如,将您的数据用作文本变量:

Local lcSample, lcTemp, lnFields, ix
TEXT to m.lcSample noshow
ddd|1999|O|%
bce|%
aaa|2009|GON|Fixed|big|MAE|1
bbb|PAL|N|Fixed|MAE|1
aaa|SMK|O|Fixed|MAE|1|1
ddd|ERT|O|%
eef|%|N|%
afd|2000|O|%
afd|200907|O|%
swq|%|O|%
%
ENDTEXT

lnFields = 0
Local Array laText[1]
For ix=1 To Alines(laText, m.lcSample)
    m.lnFields = Max(m.lnFields, Occurs('|', m.laText[m.ix]))
Endfor

#Define MAXCHARS 20 && max field width expected

Local Array laField[m.lnFields,4]
For ix = 1 To m.lnFields
    m.laField[m.ix,1] = 'F' + Ltrim(Str(m.ix))
    m.laField[m.ix,2] = 'C'
    m.laField[m.ix,3] = MAXCHARS
    m.laField[m.ix,4] = 0
Endfor

lcTemp = Forcepath(Sys(2015)+'.txt', Sys(2023))
Strtofile(m.lcSample, m.lcTemp)

Create Cursor myData  From Array laField
Append From (m.lcTemp) Delimited With "" With Character "|"
Erase (m.lcTemp)
Browse

然而,在现实世界中,这听起来不太现实。你应该对前面的数据有所了解。

此外,您还可以使用 FoxyClasses 的导入工具来获取数据。它允许您选择分隔符、映射列等,但需要一些开发人员干预数据的最终处理。

ALINES() 函数使解析变得容易。您可以依次将其应用于每一行。 @Cetin 已经向您展示了如何找出您需要多少个字段。

我不得不对一些客户数据做一些非常相似的事情。他们提供了一个字段,该字段是一个 space 分隔的数字列表,需要将其拉出到一列数字中以匹配报价。最初我将它转储到一个文本文件,然后将它导入回一个新的 table。类似于以下内容:

create table groups ; 
    (group1 c(5), group2 c(5), group3 c(5), group4 c(5), group5 c(5)) 

select grp from infile to file grps.tmp noconsole plain  

select groups
append from grps.tmp delimited with "" with character "|"