全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2351
推到 Plurk!
推到 Facebook!

如何解字串

答題得分者是:st33chen
leeman
一般會員


發表:1
回覆:3
積分:0
註冊:2006-07-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-12-03 18:26:43 IP:122.118.xxx.xxx 訂閱
正常固定字串資料為﹕C1234567CA123456789A12C123456789C12345B1234567890B 長度=50

但由類比資料輸出字串可能會少字或為﹖符號
例如﹕?123?5C?12345?6789A12?123?789C12345B1234567890?

要如何正確將各英文字母間的數字解出,分類出來到各欄位﹖

aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-12-03 20:19:22 IP:60.248.xxx.xxx 訂閱
類比資料輸出 ??? 不明白
------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
leeman
一般會員


發表:1
回覆:3
積分:0
註冊:2006-07-06

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-12-04 02:29:11 IP:218.162.xxx.xxx 訂閱
類比資料輸出 ??? 不明白

是由機器的磁頭所讀出的資料,經a/d轉換後,由rs232送出。
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-12-04 09:50:20 IP:59.115.xxx.xxx 訂閱
嗯,看來是玩真的!  你真的了解類比輸出…

可我又有一項不明白,你的問題概念太大,沒把問題精簡到程式碼上的問題。不知你是logical線路的問題,還是軟體上的問題?

或是你應該在單晶片的討論區上問。

雖然沒有正面的回應你答案,但我幫高手們把問題先厘清了,好幫你解決。

所以,若是程式碼上的問題,那就po一點程式上來。若是硬體或firmware的問題,那改到單晶片處理討論,這樣才可能有結果。


===================引 用 leeman 文 章===================
類比資料輸出 ??? 不明白

是由機器的磁頭所讀出的資料,經a/d轉換後,由rs232送出。
------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
leeman
一般會員


發表:1
回覆:3
積分:0
註冊:2006-07-06

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-12-05 03:28:05 IP:218.162.xxx.xxx 訂閱
// 將依照欄位擷取出來 
// 0 1 2 3 4 5
// 12345678901234567890123456789012345678901234567890
// C1234567CA123456789A12C123456789C12345B1234567890B
//---------------------------------------------------------------------------
int parse_read_str(
String read_str,
String &check_no,
String &bank_no,
String &exg_code,
String &account_no,
String &exp_date,
String &amount_money)
{
int len,i,str_count,spc_cnt;
char *p_str;
char temp[50];
clear_space(read_str);
p_str=&read_str.c_str()[0];
len = read_str.Trim().Length();
str_count=0;
if (len ==0)// 沒有磁字
return 1;
if (len <7)// 磁字位數<7
return 2;
str_count=0;

if (len==33&&((*p_str=='C'||*(p_str 8)=='C')&&
(*(p_str 9)=='A'||*(p_str 19)=='A')&&
(*(p_str 22)=='C'||*(p_str 32)=='C')))
{
check_no = read_str.SubString(2, 7);
bank_no = read_str.SubString(11, 9);
exg_code = read_str.SubString(21, 2);
account_no = read_str.SubString(24, 9);
exp_date = "";
amount_money = "";
}
else if (len==45&&((*p_str=='C'||*(p_str 8)=='C')&&
(*(p_str 9)=='A'||*(p_str 19)=='A')&&
(*(p_str 22)=='C'||*(p_str 32)=='C')&&
(*(p_str 33)=='B'||*(p_str 44)=='B')))
{
check_no = read_str.SubString(2, 7);
bank_no = read_str.SubString(11, 9);
exg_code = read_str.SubString(21, 2);
account_no = read_str.SubString(24, 9);
exp_date = "";
amount_money = read_str.SubString(35, 10);
}
else if (len==32&&((*p_str=='C'||*(p_str 8)=='C')&&
(*(p_str 9)=='A'||*(p_str 19)=='A')&&
(*(p_str 21)=='C'||*(p_str 31)=='C')))
{
check_no = read_str.SubString(2, 7);
bank_no = read_str.SubString(11, 9);
exg_code = read_str.SubString(21, 2);
account_no = read_str.SubString(23, 8);
exp_date = "";
amount_money = "";
}
else if (len==44&&((*p_str=='C'||*(p_str 8)=='C')&&
(*(p_str 9)=='A'||*(p_str 19)=='A')&&
(*(p_str 22)=='C'||*(p_str 31)=='C')&&
(*(p_str 32)=='B'||*(p_str 43)=='B')))
{
check_no = read_str.SubString(2, 7);
bank_no = read_str.SubString(11, 9);
exg_code = read_str.SubString(21, 2);
account_no = read_str.SubString(24, 8);
exp_date = "";
amount_money = read_str.SubString(34, 10);
}
else if (len==34&&((*p_str=='C'||*(p_str 8)=='C')&&
(*(p_str 9)=='A'||*(p_str 19)=='A')&&
(*(p_str 22)=='B'||*(p_str 33)=='B')))
{
check_no = read_str.SubString(2, 7);
bank_no = read_str.SubString(11, 9);
exg_code = read_str.SubString(21, 2);
account_no = "";
exp_date = "";
amount_money = read_str.SubString(24, 10);
return 0;
}
else if (len==22&&((*p_str=='C'||*(p_str 8)=='C')&&
(*(p_str 9)=='A'||*(p_str 19)=='A')))
{
check_no = read_str.SubString(2, 7);
bank_no = read_str.SubString(11, 9);
exg_code = read_str.SubString(21, 2);
account_no = "";
exp_date = "";
amount_money = "";
}
else if (len==39&&((*p_str=='C'||*(p_str 8)=='C')&&
(*(p_str 9)=='A'||*(p_str 19)=='A')&&
(*(p_str 27)=='B'||*(p_str 38)=='B')))
{
check_no = read_str.SubString(2, 7);
bank_no = read_str.SubString(11, 9);
exg_code = read_str.SubString(21, 2);
account_no = "";
exp_date = read_str.SubString(23,5);
amount_money = read_str.SubString(28, 10);
}
else if (len==50||((*p_str=='C'||*(p_str 8)=='C')&&
(*(p_str 9)=='A'||*(p_str 19)=='A')&&
(*(p_str 22)=='C'||*(p_str 32)=='C')&&
(*(p_str 38)=='B'||*(p_str 49)=='B')))
{
check_no = read_str.SubString(2, 7);
bank_no = read_str.SubString(11, 9);
exg_code = read_str.SubString(21, 2);
account_no = read_str.SubString(24, 9);
exp_date = read_str.SubString(34,5);
amount_money = read_str.SubString(40, 10);
}
else if (len==49&&((*p_str=='C'||*(p_str 8)=='C')&&
(*(p_str 9)=='A'||*(p_str 19)=='A')&&
(*(p_str 22)=='C'||*(p_str 31)=='C')&&
(*(p_str 37)=='B'||*(p_str 48)=='B')))
{
check_no = read_str.SubString(2, 7);
bank_no = read_str.SubString(11, 9);
exg_code = read_str.SubString(21, 2);
account_no = read_str.SubString(24, 8);
exp_date = read_str.SubString(33,5);
amount_money = read_str.SubString(39, 10);
}
else if (len==20&&((*p_str=='C'||*(p_str 8)=='C')&&
(*(p_str 9)=='A'||*(p_str 19)=='A')))
{
check_no = read_str.SubString(2, 7);
bank_no = read_str.SubString(11, 9);
exg_code = "";
account_no = "";
exp_date = "";
amount_money = "";
}
else if (len==12&&(*p_str=='B'||*(p_str 11)=='B'))
{
check_no ="";
bank_no = "";
exg_code = "";
account_no = "";
exp_date = "";
amount_money = read_str.SubString(2, 10);
}
else if (len==9&&(*p_str=='C'||*(p_str 8)=='C'))
{
check_no = read_str.SubString(2, 7);
bank_no = "";
exg_code = "";
account_no = "";
exp_date = "";
amount_money = "";
}
else if (len==11&&(*p_str=='C'||*(p_str 10)=='C'))
{
check_no = "";
bank_no = "";
exg_code = "";
account_no = read_str.SubString(2, 9);
exp_date = "";
amount_money = "";
}
else if (len==23&&((*p_str=='C'||*(p_str 10)=='C')&&
(*(p_str 11)=='B'||*(p_str 22)=='B')))
{
check_no = "";
bank_no = "";
exg_code = "";
account_no = read_str.SubString(2, 9);
exp_date = "";
amount_money =read_str.SubString(12, 10);
}
else if (len==11&&(*p_str=='A'||*(p_str 10)=='A'))
{
check_no = "";
bank_no = read_str.SubString(2, 9);
exg_code = "";
account_no = "";
exp_date = "";
amount_money = "";
}
else
{
//當有少字元或關鍵字=﹖時的處理
check_no = "";
bank_no = "";
exg_code = "";
account_no = "";
exp_date = "";
amount_money = "";
}

return 0;
}

以上為目前我所寫的程式,因為機器讀取上,因為由馬達帶動,所以有時磁頭讀取時,有些是本身磁字有缺陷或雜訊或感磁問題等,sometime會判斷時會有漏字或無法判斷
導致格式會不同,所以想把程式再修正完美一點,針對漏字作判斷處理。
st33chen
尊榮會員


發表:15
回覆:591
積分:1201
註冊:2005-09-30

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-12-07 01:23:42 IP:122.116.xxx.xxx 未訂閱
您好,

要列舉所有可能性, 程式會寫很長, 而且能否列舉所有可能性我覺得是一疑問
(因為有可能掉字, 有可能出現 ? 號).
您要解出的數字有六段, 各段長為 7, 9, 2, 9, 5, 10
我的想法是 :
1. 讀掉連續的英文字
2. 連續讀入 [ 屬於 1234567890? 的 ] [ 最多9個 ] 的字當成 第一段 ( 第一段 7 字, 加前後可能的 ? 號, 故用 9)
3. 讀掉連續的英文字
4. 連續讀入 [ 屬於 1234567890? 的 ] [ 最多11個 ] 的字當成 第二段 ( 第二段 9 字, 加前後可能的 ? 號, 故用 11)
5. 以此類推.....
取出後再看如何處理 ? 號 ( 因為您沒說 ? 號如何處理, 所以無法在此考慮)

我用 delphi 把邏輯寫成如下, 請參考一下 ( sorry, 我沒有 c 的環境 )

procedure TForm1.Button1Click(Sender: TObject);
var ii, jj, kk: integer;
astr : string;
begin
edit1.Text := 'C1234567CA123456789A12C123456789C12345B1234567890B';
edit2.text := '?123?5C?12345?6789A12?123?789C12345B1234567890';
// 各段數字長度 : 7,9,2,9,5,10
astr := trim(edit2.text);
ii := 1;
jj := length(astr);
// 取第一段數字
label1.Caption := '';
kk := 0;
while (ii<= jj) and (pos(astr[ii], '1234567890?')<=0) do ii:=ii 1;
while (ii<= jj) and (pos(astr[ii], '1234567890?')>0) and (kk<9) do begin
kk := kk 1;
label1.caption := label1.caption astr[ii];
ii := ii 1;
end;
// 取第二段數字
while (ii<= jj) and (pos(astr[ii], '1234567890?')<=0) do ii:=ii 1;
label2.Caption := '';
kk := 0;
while (ii<= jj) and (pos(astr[ii], '1234567890?')>0) and (kk<11) do begin
kk := kk 1;
label2.caption := label2.caption astr[ii];
ii := ii 1;
end;
// 取第三段數字
while (ii<= jj) and (pos(astr[ii], '1234567890?')<=0) do ii:=ii 1;
label3.Caption := '';
kk := 0;
while (ii<= jj) and (pos(astr[ii], '1234567890?')>0) and (kk<3) do begin
kk := kk 1;
label3.caption := label3.caption astr[ii];
ii := ii 1;
end;
// 取第四段數字
while (ii<= jj) and (pos(astr[ii], '1234567890?')<=0) do ii:=ii 1;
label4.Caption := '';
kk := 0;
while (ii<= jj) and (pos(astr[ii], '1234567890?')>0) and (kk<11) do begin
kk := kk 1;
label4.caption := label4.caption astr[ii];
ii := ii 1;
end;
// 取第五段數字
while (ii<= jj) and (pos(astr[ii], '1234567890?')<=0) do ii:=ii 1;
label5.Caption := '';
kk := 0;
while (ii<= jj) and (pos(astr[ii], '1234567890?')>0) and (kk<7) do begin
kk := kk 1;
label5.caption := label5.caption astr[ii];
ii := ii 1;
end;
// 取第六段數字
while (ii<= jj) and (pos(astr[ii], '1234567890?')<=0) do ii:=ii 1;
label6.Caption := '';
kk := 0;
while (ii<= jj) do begin
if pos(astr[ii], '1234567890?')>0 then begin
kk := kk 1;
label6.caption := label6.caption astr[ii];
end;
ii := ii 1;
end;
end;

其中, while (ii<= jj) and (pos(astr[ii], '1234567890?')<=0) do ii:=ii 1; 就是讀掉英文字.
pos(astr[ii], '1234567890?')<=0 代表 小字串 沒在 大字串 中.
其他 轉成 c 應該不難.


------
IS IT WHAT IT IS
我是 李慕白 請倒著唸.
又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦);
都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲.
編輯記錄
st33chen 重新編輯於 2008-12-07 01:32:20, 註解 無‧
leeman
一般會員


發表:1
回覆:3
積分:0
註冊:2006-07-06

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-12-10 13:30:23 IP:122.118.xxx.xxx 訂閱
謝謝 st33chen 的答覆,我參考您的程式後,大概知道方法了。
系統時間:2024-04-26 15:48:04
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!