線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1633
推到 Plurk!
推到 Facebook!

抓取TXT檔的數字

尚未結案
penny015
一般會員


發表:20
回覆:15
積分:7
註冊:2005-03-25

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-06-30 12:59:08 IP:220.130.xxx.xxx 未訂閱
我現在找了一下之前文章,發現有類似的程式,只是條件判斷一直搞不定 P.S:1.只要抓檔案Number42開始 Measured這一行的數字就好了(目前總共有3大段,以後會有更多)      2.若數字後面的單位是"m"就要將數字/1000,若數字後面的單位是"k"就要將數字*1000   
  
    int col=0;
    int row=0;
    int iArray[256][256];
    AnsiString sz;
    TStringList *slRow = new TStringList;
    TStringList *slCol = new TStringList;
    AnsiString nStr = ".0123456789";
    AnsiString chkStr;        if (OpenDialog1->Execute()) {
        slRow->LoadFromFile(OpenDialog1->FileName);
        for (int i=0; iCount; i++) {
            chkStr = slRow->Strings[i].SubString(1, 4);
            chkStr = chkStr.Trim();  // 取前四個字元,並截掉前後的空白字元
            // 如果第一個字元不是數字,且前兩個字元不是 "0 " 則視為所需之資料
            if(nStr.Pos(chkStr.SubString(1,1)) > 0 && chkStr.SubString(1, 2) != "0 "){
                row++;
                col = 0;
                if(StringGrid1->RowCount < row+1){
                    StringGrid1->RowCount = row+1;
                }
                sz = slRow->Strings[i].SubString(5, slRow->Strings[i].Length()-4);//這一段程式的作用是什麼???
                sz = sz.Trim();  // 截掉前後的空白字元
                slCol->CommaText = sz;  // 拆解行資料為欄位資料
                sz = "";
                for (int j=0; jCount; j++) {
                       col++;
                    if(StringGrid1->ColCount < col+1){
                        StringGrid1->ColCount = col+1;
                    }
                    iArray[i][j] = StrToInt(slCol->Strings[j]);                        StringGrid1->Cells[col][row] = (IntToStr(iArray[i][j]));
                }
            }
        }
        delete slCol;
        delete slRow;
    }
http://delphi.ktop.com.tw/loadfile.php?TOPICID=23222735&CC=519365 發表人 - penny015 於 2005/06/30 13:02:15 發表人 - penny015 於 2005/06/30 13:06:43
blk5743
高階會員


發表:34
回覆:371
積分:236
註冊:2003-11-17

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-06-30 19:45:43 IP:61.66.xxx.xxx 未訂閱
penny015你好 slRow->Strings[i].SubString(5, slRow->Strings[i].Length()-4); slRow->Strings[i]是指你讀進來的第幾個ROW SubString(5, slRow->Strings[i].Length()-4); 是指擷取該行的字串,從第5個字元開始,到長度減4(也就是扣掉前4個字元的字串)
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-07-03 00:06:41 IP:59.115.xxx.xxx 未訂閱
penny015 您好:    我看到您在另一篇的發問了,同時我也下載了您的資料檔來查看過,但是您對於所要處理的過程描述得不是很詳盡,因此我僅能就我本身對問題的瞭解嘗試著解題,以下是我的解法,我儘量在各個敘述都加上相關註解:
    int col = 0;
    int row = 0;
    int dataCnt = -1;  // 設定陣列資料時使用的索引值
    double iArray[1024];  // 隨意設定的陣列大小,請視需要自行調整
    AnsiString sz;
    TStringList *slRow = new TStringList; // 存放資料行的字串陣列
    TStringList *slCol = new TStringList; // 拆解資料行的字串陣列
    AnsiString nStr = "0123456789";  // 比對是否為數字資料的字串
    AnsiString chkStr;        if (OpenDialog1->Execute()) {
        slRow->LoadFromFile(OpenDialog1->FileName);
        for (int i=0; iCount; i  ) {
            chkStr = slRow->Strings[i].SubString(1, 8);
            chkStr = chkStr.Trim();  // 取前 8 個字元,並截掉前後的空白字元                // 如果不是空字串,且第一個字元不是數字,第 3 個字元也不是 "/" (日期分隔符號) 時,則視為需要處理的資料行
            if(nStr.Pos(chkStr.SubString(1,1)) > 0 && chkStr.SubString(3,1) != "/" && chkStr.Length() > 0){
                if (StrToInt(chkStr) >= 24) {  // 編號大於等於 24 的資料行才做處理
                    sz = slRow->Strings[i].SubString(77, 15);  // 擷取 Measured 欄位的資料
                    sz = sz.Trim();
                    if (sz.Length() > 0) { // 如果不是空字串則進行拆解與分析
                        row  ;
                        dataCnt  ;
                        col = 0;
                        if (StringGrid1->RowCount < row 1) {  // 若 StringGrid 行 (row) 數不夠,則增加之
                            StringGrid1->RowCount = row 1;
                        }
                        StringGrid1->Cells[col][row] = chkStr;  // 顯示被處理資料行的編號
                        slCol->CommaText = sz;  // 拆解 Measured 欄位的資料 (以便區分數字與其後的識別符號)                            col  ;
                        iArray[dataCnt] = StrToFloat(slCol->Strings[0]);  // 將數字設給陣列
                        StringGrid1->Cells[col][row] = FloatToStr(iArray[dataCnt]);  // 顯示數字資料於 StringGrid 之上
                        if (slCol->Count > 1) {  // 如果數字後方有其它識別字樣時
                            sz = slCol->Strings[1];  // 取得識別字樣
                            sz = sz.LowerCase();  // 轉為小寫字母                                double tf = iArray[dataCnt];
                            bool step2 = false;
                            if (sz == "m") {  // 如果識別字樣為 m
                                tf = tf / 1000.0;  //將數字除以 1000
                                step2 = true;
                            } else if (sz == "k") {  // 如果識別字樣為 k
                                tf = tf * 1000.0;  //將數字乘以 1000
                                step2 = true;
                            }
                            if (step2) {  // 如果識別字樣為 m 或 k
                                col  ;
                                StringGrid1->Cells[col][row] = slCol->Strings[1]; // 顯示識別字樣
                                col  ;
                                StringGrid1->Cells[col][row] = FloatToStr(tf);  // 顯示重新計算後的數字
                            }
                        }
                    }
                }
            }
        }
    }
    delete slCol;
    delete slRow;
您先試試看吧,希望能夠幫上忙。 7 天天敲鍵盤 v 時時按滑鼠 8 發表人 - RedSnow 於 2005/07/03 00:16:30
系統時間:2024-11-25 13:45:25
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!