none
以列切割原始碼成陣列問題 RRS feed

  • 問題

  • 小弟以WebClient抓取網頁原始檔,想以列為單位切割成字串陣列,使用string.Spli,嘗試過

    vbNewLine

    vbCrLf

    "\r\n"

    "\n"

    等各種分行字元,但都無法達成預期,使用vbNewLine,vbCrLf在某些網頁原始檔可使用,但整個檔案幾百列只有找到一個分行字元,變成只能切成兩個陣列元素字串.而更多網頁原始檔完全找不到.

    使用"\r\n"和"\n",完全找不到任何可以切割的原始檔.

    小弟在php使用split做相同的事,分別用"\r\n"和"\n"去測試,一定有一個可用.

    請教賢拜先進,WebClient載入的原始檔是用什麼字元作分行呢?

    懇請不吝指導,感恩再三.

    • 已移動 小朱MVP, Moderator 2012年6月4日 上午 03:39 (從:Visual Studio一般討論區(General))
    2012年6月3日 下午 02:27

解答

  • 沒有 String.Spli 吧...

    WebClient 並非是載入原始碼,他只是下載。

    裡面是啥字元分隔,下載後存檔,再用二進位編輯器去觀察最簡單。

    原始網頁怎樣處理,各家網站不同,只能看了內容再去判斷。不過在 VBNET 中絕對不會去用 C 家族的 \n \r 這種特殊字元表示式,因為 VBNET 根本不支援,你能用那才有鬼...

    你可以試試 vbCr, vbLf 。

    另外請看清楚各版面的說明,貼在對應的版面,不是隨便選個版就貼進去。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    • 已標示為解答 a670334 2012年6月4日 上午 09:38
    2012年6月3日 下午 03:27

所有回覆

  • 沒有 String.Spli 吧...

    WebClient 並非是載入原始碼,他只是下載。

    裡面是啥字元分隔,下載後存檔,再用二進位編輯器去觀察最簡單。

    原始網頁怎樣處理,各家網站不同,只能看了內容再去判斷。不過在 VBNET 中絕對不會去用 C 家族的 \n \r 這種特殊字元表示式,因為 VBNET 根本不支援,你能用那才有鬼...

    你可以試試 vbCr, vbLf 。

    另外請看清楚各版面的說明,貼在對應的版面,不是隨便選個版就貼進去。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    • 已標示為解答 a670334 2012年6月4日 上午 09:38
    2012年6月3日 下午 03:27
  • 嘗試過 vbNewLine vbCrLf "\r\n" "\n" 等各種分行字元...

    這種問題本身就有點奇怪, 所以我必須先測試你對網頁的了解程度 (只是為了讓大家知道怎麼回答而已, 沒有不敬的意思)。我要先請你回答一個問題:

    <p>abc def ghijk lmn op, q rs tuv wxyz.</p>
    <p>abc def ghijk lmn op, q rs tuv wxyz. abc def ghijk lmn op, q rs tuv wxyz. 
    abc def ghijk lmn op, q rs tuv wxyz. abc def ghijk lmn op, q rs tuv wxyz.<br /> abc def ghijk lmn op, q rs tuv wxyz. abc def ghijk lmn op, q rs tuv wxyz. abc def ghijk lmn op, q rs tuv wxyz.<br /> abc def ghijk lmn op, q rs tuv wxyz. abc def ghijk lmn op, q rs tuv wxyz. abc def ghijk lmn op, q rs tuv wxyz. abc def ghijk lmn op, q rs tuv wxyz. </p>

    如果你抓到的原始 HTML 碼如上, 你認為它算是幾行, 以及你會使用什麼斷行字元去做 string.split() ? 你的回答將有助於讓你原來的問題更明確一點。


    2012年6月3日 下午 06:57
  • 網頁文件並非以vbNewLine, vbCrLf, "\r\n", "\n"當做換行字元, 所以這樣切割當然不會成功, 如果要解析網頁文件的內容, 建議可以使用HTML Agility Pack

    2012年6月4日 上午 03:12
  • 心冷熱情熄老師

    小弟用vbLf,已可正確達到預期,查閱MSDN,才知道這個"列印和顯示功能時使用的換行字元",是我需要的正確字元,一直以為是vbNewLine.

    真是太感謝了.

    至於什麼內容該貼哪個版,造成各位老師困擾,小弟惶恐萬分,學習過程是由不知到知少然後至知多,小弟學習VS2008期間不長,寫過幾個資料庫應用的小程式,幾個月前才知道我在學的東西名稱叫做VB.NET,我一直以為是叫VB.看到Visual Studio 一般討論區我就進來了,如果跑錯了,小弟在此賠罪,會出錯是因為我的程度尚不足分辨這個版和其他版有什麼專業上的區別.如果能像醫學系統一樣設個家醫科就更好了,因為腎結石不知道是該掛腎臟科還是泌尿科,可以先到家醫科看看,就不會跑錯了.

    2012年6月4日 上午 03:15
  • 謝謝Johnny.Net老師

    小弟指的在文字編輯器上按下Enter那個換行,而不是指寫HTML的<br><p>那種換行標籤.

    用php輸出字串時加上"\n"或'\r\n,以文字編輯器看客戶端下載的HTML原始碼,就看到字串換行顯示.用PHP抓網頁原始碼,我是用"\n"或"\r\n"去找換行字元,因為有的網頁用"\n",有的用"\r\n",也有反過來用"\n\r",後者以記事本開啟時不會換行,只會在字元位置顯示一個黑方塊,以DW開啟能辨識這個字元,也會換行顯示.

    小弟需求是把原始碼字串以換行字元Split成陣列,再依次找出所要的東西.本來用正規處理,但我要抓的東西雖然固定位置,字串會出現什麼卻不一定,可能英文,可能中文,或中英混雜,或英數混雜,或中英數混雜,甚至是一串符號加空格,長度也不一定,花許多時間去了解regularExpression,最後是放棄.我只要把需求的字串前後相關字串切開,比對陣列是否含有這兩個字串,再依比對的前後字串出現的位置算出擷取目標的長度即可,這是小弟的土法煉鋼,低科技,但覺得比正規省事.

    2012年6月4日 上午 04:10
  • 您好,

    您也可研究一下 Regex.Split 

    [.NET]將字串依某些分隔字串Split,並包含分隔字串

    希望對您有幫助!


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2012年6月4日 上午 04:44
  • 小弟指的在文字編輯器上按下Enter那個換行,而不是指寫HTML的<br><p>那種換行標籤.

    以什麼方式處理斷行, 跟編輯器 (editor) 有關。一般都以 "\r\n" 來結束一行, 但是就像你看見的, 並不是每個編輯器都是如此。

    我可以想像, 你應該是想把斷行不正確的原始碼重新整理。但依我之見, 簡單的 string.Replace 指令就足以把事情做好, 用不到 Regex (使用 Regex 效能也不會更好)。例如 (使用 C#)

    string source = "a\r\nb\n\rc\rd\ne";
    string target = source.Replace("\n\r", "\r\n").
        Replace("\r\n", "\r\n").
        Replace("\r", "\r\n").
        Replace("\n", "\r\n").
        Replace("\r\n", "\r\n");
    請注意那個中介的代換變數是全形字; 你可以使用任何你喜歡的其它逸出字串來取代。



    2012年6月4日 上午 04:52
  • string source = "a\r\nb\n\rc\rd\ne";
    string target = source.Replace("\n\r", "\r\n").
        Replace("\r\n", "\r\n").
        Replace("\r", "\r\n").
        Replace("\n", "\r\n").
        Replace("\r\n", "\r\n");

    Johnny.Net老師,感謝您

    這就是問題所在了.用WebClient的DownloadData抓下來的原始碼字串中,根本不可能找得到"\n","\r\n"等等這些換行字元,所以小弟才來問vb.net的換行字元是什麼.

    小弟測試http://tw.blog.yahoo.com/ 這個網址,用php的file_get_contents()函數抓下原始碼直接存在變數,再用"\n"當切割字串,得到陣列個數806.而用vb.net的DownloadData抓下來原始檔,也是直接存在變數,然後用"\n"當字串切割,得到陣列個數是1,也就是找不到"\n"這個字元,可見當vb.net的控制項把原始碼抓下時,就已經把原來的換行字元換成自家的換行字元了,經心冷熱情熄老師指點用vbLf為切割字元,得到814個陣列個數.所以在vb.net就要照vb的規矩來.

    2012年6月4日 上午 09:07
  • 您好,

    您也可研究一下 Regex.Split 

    [.NET]將字串依某些分隔字串Split,並包含分隔字串

    希望對您有幫助!


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    亂馬客 老師,感謝您的建議

    因為規則運算式讓我的預期工作複雜化,所以才要用自認的比較合身的方法打造一個輪子.

    2012年6月4日 上午 09:20
  • 1. 這是常識問題。

    vbNewLine 是標準換行字元,RFC 也是規定用這個,但是這有兩個 bytes ,此外,Linux 慣用換行字元只用歸位字元,所以瀏覽器裡面兩者皆要相容,最後為了節省傳輸量,像是 google 、yahoo 都會縮掉換行字元。

    2. 版面下有小字說明,整合開發環境指的是 IDE 介面,也就是你編寫程式碼那個介面,針對編譯、程式碼版面、操作進行討論。

    Visual Studio一般討論區(General)

    討論Visual Studio整合開發環境,分享小技巧或各種訣竅


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年6月4日 下午 12:41