2017-05-08 50 views
0

我在FoxPro中有一組輸入數據。其中一個字段grp字段是一個連接字符串,其各個部分由管道符號「|」分隔。下面是值的一些實例,可以採取:將輸入字段從文本轉換爲FoxPro或SQL中的列

GRP:

DDD | 1999年| O |%

BCE |%

AAA | 2009 | GON |固定|大| MAE | 1個

BBB | PAL | N |固定| MAE | 1個

AAA | SMK | O |固定| MAE | 1 | 1

DDD | ERT | O |%

EEF |%| N |%

AFD | 2000 | O |%

AFD | 200907 | O |%

SWQ |% | O |%

我想編寫一個查詢,將上述數據中分離上述成單獨的字段nd將它們輸出到另一個SQL表,其中分隔的決定因素是管道符號。服用前兩行作爲一個例子,輸出應讀

記錄1:

字段1 = DDD字段2 = 1999字段3 = O字段4 =%

記錄2: 字段1 = BCE字段2 =% Field3不包含任何值Field4不包含任何值

預先不知道數據中管道符號的最大數目是多少。在上面的例子中,它是6,記錄3和5.

實際上可以做到這一點嗎?

+1

請僅使用相關產品標籤,而不是每個在其中都有字母'sql'的產品標籤。 – Shadow

回答

1

您可以創建一個遊標並使用'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的導入工具來獲取數據。它允許您選擇分隔符,映射列等,但需要一些開發人員干預數據的最終處理。

0

ALINES()函數使解析變得簡單。你可以依次將它應用到每一行。 @Cetin已經向你展示瞭如何找出你需要的領域。

0

我不得不做一些非常類似的一些客戶端數據。他們提供了一個空格分隔的數字列表,需要將數字列入單列數字以匹配要約。最初我將它轉儲到一個文本文件中,並將其導入到一個新表格中。類似以下內容:

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 "|"