none
寫入多個檔案 RRS feed

  • 問題

  • 大家好:

          我希望判斷資料後將資料分別寫到不同檔案中, 我的資料如下 , 排序過的資料(依10~40排) , 判斷的部份我想以判斷號碼跟前一號碼不同時 , 就開一個新檔 , 然後逐筆寫入 , 直到下一次號碼不同時 , 再開一個檔並冩入 , 但前一個檔如何關閉及新檔應該在何時宣告, 如何在判斷語法中再動態依變數宣告才不會有問題 , 這部份可否請大家幫忙. 我不打算每寫一筆資料就開一次檔 ; 然後寫完就關檔的方式 , 這樣資料一多效能會很慢 , 先感謝所有回應者.

    編號(num)     要寫入檔案的資料(data)

    10               "寫到10.txt"
    10               "寫到10.txt"
    10               "寫到10.txt"
    20               "寫到20.txt"
    30               "寫到30.txt"
    30               "寫到30.txt"
    40               "寫到40.txt"
    40               "寫到40.txt"
    40               "寫到40.txt"

    以下是我嘗試寫的語法 , 但有錯 ,

    -------------------

    dim f_num as integer = 9999     'f_num是用來判斷號碼是否與前一筆號碼一樣 , 9999這個號碼不會出現在資料中

    for each rd in query             ' query是上方資料的集合  rd是它其中一筆資料

        if f_num <> rd.num then            ' rd.num是上方資料中第一欄的編號
           Dim filename FileInfo("D:/T" & rd.num & ".txt")
        end if

        f_item = rd.num
        Dim sw As StreamWriter = filename.AppendText

        sw.WriteLine(rd.data)        ' rd.data是上方資料中欄的字串
        sw.Flush()

    next



    2012年9月8日 下午 01:38

解答

  • 我想, 如果先在記憶體做完後再做寫入可能快一點.

    你可以用一個 Dictionary 類別來存放資料 Dictionary(Of Int32, String), 然後用編號當鍵值

    當取出一筆資料就比對 Dictionary 的鍵值, 有就將新的 String 加入到此鍵值對應的 String, 沒有則新增一個鍵值再加入 String

    整個做完, 再用新的迴圈寫入.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    • 已標示為解答 jeff-huangch 2012年9月9日 上午 01:42
    2012年9月8日 下午 04:42
    版主

所有回覆

  • 請問你是在寫虛擬碼嗎?

    1. 你的 f 是什麼

    2. fw 宣告在 if 裡面,你不知道外面不認識 fw 嗎?

    3. rd 和 query 又是啥?

    如果你不會解釋清楚問題,建議你好好整理過你的問題再發問。


    學習不是查個 Google 套個書上的範例就算了,而是去熟悉了解每個程式碼背後的意義,否則就算學個幾百年,它也不會是你的。

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    2012年9月8日 下午 02:09
    版主
  • 謝謝您的指教 , 本來並不打算列出測試中的程式碼 , 但為了讓大家多一點訊息以了解文字所描述的問題 , 所以就列了上來 , 本以為配合資料結構 ,眾高手應該就大概能了解 , 所以就未詳加註解 , 如果造成你的不便 , 在此向您致歉並謝謝您的回應. 我已再加上部份註解 , 希望可以讓大家更了解我的問題.

    其實這段程式碼我本來真的想以虛擬碼方式的表達 , 因為我不曉得程式上應該如何宣告才能達成我想用的解決方法(如上問題文字描述部份) , 其實我也可以先將資料查詢分次查出 , 然後寫入檔案  , 例如先查出編號10的資料 , 然後開檔 寫檔 再關檔 , 再查出編號20的資料 , 再進行一次檔案處理 , 這樣檔案處理的效率會高很多 , 但查詢的時間也會讓程式慢很多.

    2012年9月8日 下午 03:38
  • 我想, 如果先在記憶體做完後再做寫入可能快一點.

    你可以用一個 Dictionary 類別來存放資料 Dictionary(Of Int32, String), 然後用編號當鍵值

    當取出一筆資料就比對 Dictionary 的鍵值, 有就將新的 String 加入到此鍵值對應的 String, 沒有則新增一個鍵值再加入 String

    整個做完, 再用新的迴圈寫入.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    • 已標示為解答 jeff-huangch 2012年9月9日 上午 01:42
    2012年9月8日 下午 04:42
    版主
  • 謝謝版主的回應 , 我目前也是想以此方式解決 , 也就是將相同編號而要寫檔的資料先存在一個list(of T)中 , 再用另一個迴圈來一一寫入 , 這樣開檔 及關檔只需一次 , 但flush的部份我就不知道是否可以一次處理 , 在系統中應該是先將寫入的資料存入streamwriter物件 , 它應該是一個 buffer吧 , 如果系統的memory夠大 , 最後再一次flush應該是ok吧 , 不曉得這樣的做法是否正確 .

    2012年9月9日 上午 02:04