2010-05-31 2 views
5

Мне нужно записать приведенные ниже данные в текстовый файл после замены двух значений на ## IP ##, ## PORT ##. Каков наилучший способ? Должен ли я держать все в строке и использовать Replace и писать в текстовый файл?Лучший способ обработки огромных строк в C#

данных:

[APP] 
    iVersion= 101 
    pcVersion= 1.01a 
    pcBuildDate=Mar 27 2009 
[MAIN] 
    iFirstSetup=  0 
    rcMain.rcLeft= 676 
    rcMain.rcTop=  378 
    rcMain.rcRight= 1004 
    rcMain.rcBottom= 672 
    iShowLog=   0 
    iMode=    1 
[GENERAL] 
    iTips=    1 
    iTrayAnimation=  1 
    iCheckColor=  1 
    iPriority=   1 
    iSsememcpy=   1 
    iAutoOpenRecv=  1 
    pcRecvPath=   C:\Documents and Settings\karthikeyan\My Documents\Downloads\fremote101a\FantasyRemote101a\recv 
    pcFileName=   FantasyRemote 
    iLanguage=   1 
[SERVER] 
    iAcceptVideo=  1 
    iAcceptAudio=  1 
    iAcceptInput=  1 
    iAutoAccept=  1 
    iAutoTray=   0 
    iConnectSound=  1 
    iEnablePassword= 0 
    pcPassword= 
    pcPort=   7902 
[CLIENT] 
    iAutoConnect=  0 
    pcPassword= 
    pcDefaultPort= 7902 
[NETWORK] 
    pcConnectAddr=##IP## 
    pcPort=##Port## 
[VIDEO] 
    iEnable=     1 
    pcFcc=     AMV3 
    pcFccServer=   
    pcDiscription=   
    pcDiscriptionServer= 
    iFps=     30 
    iMouse=     2 
    iHalfsize=    0 
    iCapturblt=    0 
    iShared=     0 
    iSharedTime=    5 
    iVsync=     1 
    iCodecSendState=   1 
    iCompress=    2 
    pcPlugin=    
    iPluginScan=    0 
    iPluginAspectW=   16 
    iPluginAspectH=   9 
    iPluginMouse=    1 
    iActiveClient=   0 
    iDesktop1=    1 
    iDesktop2=    2 
    iDesktop3=    0 
    iDesktop4=    3 
    iScan=     1 
    iFixW=     16 
    iFixH=     8 
[AUDIO] 
    iEnable=     1 
    iFps=     30 
    iVolume=     6 
    iRecDevice=    0 
    iPlayDevice=    0 
    pcSamplesPerSec= 44100Hz 
    pcChannels=  2ch:Stereo 
    pcBitsPerSample=  16bit 
    iRecBuffNum=   150 
    iPlayBuffNum=    4 
[INPUT] 
    iEnable=     1 
    iFps=     30 
    iMoe=      0 
    iAtlTab=     1 
[MENU] 
    iAlwaysOnTop=    0 
    iWindowMode=    0 
    iFrameSize=    4 
    iSnap=     1 
[HOTKEY] 
    iEnable=       1 
    key_IDM_HELP=    0x00000070 
    mod_IDM_HELP=    0x00000000 
    key_IDM_ALWAYSONTOP=  0x00000071 
    mod_IDM_ALWAYSONTOP=  0x00000000 
    key_IDM_CONNECT=   0x00000072 
    mod_IDM_CONNECT=   0x00000000 
    key_IDM_DISCONNECT=  0x00000073 
    mod_IDM_DISCONNECT=  0x00000000 
    key_IDM_CONFIG=   0x00000000 
    mod_IDM_CONFIG=   0x00000000 
    key_IDM_CODEC_SELECT=  0x00000000 
    mod_IDM_CODEC_SELECT=  0x00000000 
    key_IDM_CODEC_CONFIG=  0x00000000 
    mod_IDM_CODEC_CONFIG=  0x00000000 
    key_IDM_SIZE_50=   0x00000074 
    mod_IDM_SIZE_50=   0x00000000 
    key_IDM_SIZE_100=   0x00000075 
    mod_IDM_SIZE_100=   0x00000000 
    key_IDM_SIZE_200=   0x00000076 
    mod_IDM_SIZE_200=   0x00000000 
    key_IDM_SIZE_300=   0x00000000 
    mod_IDM_SIZE_300=   0x00000000 
    key_IDM_SIZE_400=   0x00000000 
    mod_IDM_SIZE_400=   0x00000000 
    key_IDM_CAPTUREWINDOW=  0x00000077 
    mod_IDM_CAPTUREWINDOW=  0x00000004 
    key_IDM_REGION=   0x00000077 
    mod_IDM_REGION=   0x00000000 
    key_IDM_DESKTOP1=   0x00000078 
    mod_IDM_DESKTOP1=   0x00000000 
    key_IDM_ACTIVE_MENU=  0x00000079 
    mod_IDM_ACTIVE_MENU=  0x00000000 
    key_IDM_PLUGIN=   0x0000007A 
    mod_IDM_PLUGIN=   0x00000000 
    key_IDM_PLUGIN_SCAN=  0x00000000 
    mod_IDM_PLUGIN_SCAN=  0x00000000 
    key_IDM_DESKTOP2=   0x00000078 
    mod_IDM_DESKTOP2=   0x00000004 
    key_IDM_DESKTOP3=   0x00000079 
    mod_IDM_DESKTOP3=   0x00000004 
    key_IDM_DESKTOP4=   0x0000007A 
    mod_IDM_DESKTOP4=   0x00000004 
    key_IDM_WINDOW_NORMAL=  0x0000000D 
    mod_IDM_WINDOW_NORMAL=  0x00000004 
    key_IDM_WINDOW_NOFRAME= 0x0000000D 
    mod_IDM_WINDOW_NOFRAME= 0x00000002 
    key_IDM_WINDOW_FULLSCREEN= 0x0000000D 
    mod_IDM_WINDOW_FULLSCREEN= 0x00000001 
    key_IDM_MINIMIZE=   0x00000000 
    mod_IDM_MINIMIZE=   0x00000000 
    key_IDM_MAXIMIZE=   0x00000000 
    mod_IDM_MAXIMIZE=   0x00000000 
    key_IDM_REC_START=   0x00000000 
    mod_IDM_REC_START=   0x00000000 
    key_IDM_REC_STOP=   0x00000000 
    mod_IDM_REC_STOP=   0x00000000 
    key_IDM_SCREENSHOT=  0x0000002C 
    mod_IDM_SCREENSHOT=  0x00000002 
    key_IDM_AUDIO_MUTE=  0x00000073 
    mod_IDM_AUDIO_MUTE=  0x00000004 
    key_IDM_AUDIO_VOLUME_DOWN= 0x00000074 
    mod_IDM_AUDIO_VOLUME_DOWN= 0x00000004 
    key_IDM_AUDIO_VOLUME_UP= 0x00000075 
    mod_IDM_AUDIO_VOLUME_UP= 0x00000004 
    key_IDM_CTRLALTDEL=  0x00000023 
    mod_IDM_CTRLALTDEL=  0x00000003 
    key_IDM_QUIT=    0x00000000 
    mod_IDM_QUIT=    0x00000000 
    key_IDM_MENU=    0x0000007B 
    mod_IDM_MENU=    0x00000000 
[OVERLAY] 
    iIndicator=   1 
    iAlphaBlt=    1 
    iEnterHide=   0 
    pcFont=  MS UI Gothic 
[AVI] 
    iSound=     1 
    iFileSizeLimit=  100000 
    iPool=      4 
    iBuffSize=    32 
    iStartDiskSpaceCheck=  1 
    iStartDiskSpace=  1000 
    iRecDiskSpaceCheck=  1 
    iRecDiskSpace=   100 
    iCache=     0 
    iAutoOpen=     1 
    pcPath=C:\Documents and Settings\karthikeyan\My Documents\Downloads\fremote101a\FantasyRemote101a\avi 
[SCREENSHOT] 
    iSound=  1 
    iAutoOpen= 1 
    pcPath=  C:\Documents and Settings\karthikeyan\My Documents\Downloads\fremote101a\FantasyRemote101a\ss 
    pcPlugin= BMP 
[CDLG_SERVER] 
    mrcWnd.rcLeft=  667 
    mrcWnd.rcTop=  415 
    mrcWnd.rcRight= 1013 
    mrcWnd.rcBottom= 634 
[CWND_CLIENT] 
    miShowLog=   0 
    m_iOverlayLock=  0 
[CDLG_CONFIG] 
    mrcWnd.rcLeft=  467 
    mrcWnd.rcTop=  247 
    mrcWnd.rcRight= 1213 
    mrcWnd.rcBottom= 802 
    miTabConfigSel=  2 
+0

Считаете ли вы, что ваш браузер работает с этим свободно, даже если разметка добавлена ​​с помощью javascript. – Dykam

+0

Лучший способ - не писать инструмент в C#, а использовать один из готовых. –

ответ

4

Я предлагаю вам просто читать файл и заменить. Это должно быть хорошо. Если вы беспокоитесь об эффективности, я предлагаю вам оценить производительность и попытаться исправить позже, если это проблема.

Пример.

string file = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "foo.file"); 
string s = File.ReadAllText(file); 

s = s.Replace("##IP##", "127.0.0.1"); 
s = s.Replace("##PORT##", "80"); 

File.WriteAllText(file, s); 
6

Почему это выглядит для меня как файл INI? Попробуйте использовать Nini.

EDIT: Добавлен образец

Вот простой пример, как можно использовать библиотеку Нини.

using System; 
    using Nini; 
    using Nini.Ini; 
    using Nini.Config; 
    using System.IO; 

    namespace CommandLine 
    { 
     class Test 
     { 
      static void Main(string[] Args) 
      { 
       string myIniTxt = Path.Combine(Environment.CurrentDirectory, "ini.txt"); 
       IniConfigSource ini = new IniConfigSource(myIniTxt); 
       IConfig config = ini.Configs["NETWORK"]; 
       config.Set("pcConnectAddr", "myValueForPcConnectAdd"); 
       config.Set("pcPort", "myValueForPcPort"); 
       ini.Save(); 
      } 
     } 
    } 

Примечание: Первая ссылка для «Нини», похоже, не работает, но вот некоторые другие.

http://sourceforge.net/projects/nini/

http://nini.sourceforge.net/Manual/NiniManual.htm

+0

+1 для использования Nini –

+0

Вы уверены, что совместима с .net frameworks новее чем 1.1? – backslash17

+0

@ backslash17 Я использую NINI в одном проекте .NET 3.5 без ошибок в течение примерно 1 года. – adopilot

1

Если вы абсолютно уверены о размере файла, и вы знаете, что это не будет превышать сказать пару сотен MB затем прочитать его в памяти и сделать регулярное выражение замены. Тем не менее, для гибкости я готов к файлу по одной строке за раз, сделаю замену и выпишу во второй файл.

+0

Я уверен, что размер файла не будет превышать. Можете ли вы дать пример, чтобы справиться с этим сейчас? – Anuya

3

Я думаю, вы можете использовать StringBuilder здесь.

StringBuilder позволяет вам манипулировать/заменять строку в том же месте памяти.

Каждый раз, когда вы манипулируете строкой, выделяется новая память для хранения результата, а старая строка - сбор мусора. StringBuilder специально разработан для создания изменяемых строк.

Редактировать комментарий: Шаблон (текст без замен) можно поместить в настройку проекта. IDE позаботится обо всем остальном.

Если это действительно огромный размер, лучше поместить его в файл в установочной папке. Затем вы должны убедиться, что файл установлен вместе с вашим приложением.

Вы поместите файл "MyTemplate.txt" в StringBuilder, как это:

var fileName = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase)), 
    "MyTemplate.txt"); 
var stringBuilder = new StringBuilder(File.ReadAllText(fileName)); 
+0

Но, как я могу добавить все данные в строку ... Потому что есть много escape-последовательностей! – Anuya

1

Вы также можете проверить это: Memory Efficiency and Performance of String.Replace .NET Framework.

Вы можете сделать следующее для чтения из файла, поиска, замены и последующей записи.

using System; 
using System.IO; 
using System.Text.RegularExpressions; 
static public void ReplaceInFile(string filePath, string searchText, string replaceText) 
{ 
    StreamReader reader = new StreamReader(filePath); 
    string content = reader.ReadToEnd(); 
    reader.Close(); 

    content = Regex.Replace(content, searchText, replaceText); 

    StreamWriter writer = new StreamWriter(filePath); 
    writer.Write(content); 
    writer.Close(); 
} 

Смотрите также этот код с нуля: http://www.codeproject.com/KB/string/fastestcscaseinsstringrep.aspx

1

Должен ли я держать все в строку и использовать Заменить и записать в текстовый файл?

Это первое, что нужно попробовать. Строка довольно маленькая (не мегабайты), и я думаю, вы не будете делать это часто или в цикле (вы будете делать это только один раз), и что задержка будет составлять лишь часть секунды, что хорошо для вас, и это другое более сложное решение с использованием StringBuilder будет не более чем в два раза быстрее.

0

Лучший способ - вручную проанализировать содержимое файла и выполнить замены с помощью StringBuilder.

+0

Иногда «лучший» может означать «наименее/наиболее очевидные строки исходного кода», например. используя метод 'string.Replace'. – ChrisW

Смежные вопросы