[C#] 텍스트 파일에서 원하는 줄만 가져오기
http://chaoskcuf.com/137#comment2972 에 대한 답변입니다.
첨부한 test.txt와 같이 line 단위로 이루어져 있는 파일이 있다고 가정을 하고,
이 파일에서 원하는 부분(예를 들어 100번째 열부터 10줄 단위로 )을 가져오고 싶을 때의 효과적인 방법입니다.
개념은 간단합니다.
StreamReader 객체로 ReadLine을 하면 Line을 읽고 난 다음의 위치를 StreamReader 객체가 기억하고 있기 때문에,
매번 파일을 열어서 해당 파일을 내용을 확인하고 파일을 닫고 하는 과정이 반복되게 코드를 작성하지 마시고,
StreamReader 객체를 한번만 선언하고 계속 그 객체를 이용하시기 바랍니다.
class Program
{
static StreamReader _sr = null;
static int _currentLine = 0;static void Main(string[] args)
{
try
{
_sr = new StreamReader("test.txt");
}
catch (Exception ex)
{
_sr = null;
Console.WriteLine(ex.Message);
}bool isSeekable = SeekLine(30); // 처음 몇 줄(예를 들어 30째 줄)을 건너뛰고 싶을 때
string[] a = GetNextLines(10); // 30번째 이후 10개 줄의 내용
string[] b = GetNextLines(10); // 40번째 이후 10개 줄의 내용
string[] c = GetNextLines(20); // 50번째 이후 20개 줄의 내용
}static bool SeekLine(int line)
{
if (_sr == null)
return false;for (int i = 0; i < line; i++)
{
if (string.IsNullOrEmpty(_sr.ReadLine()))
{
return false;
}
else
{
_currentLine++;
}
}return true;
}static string[] GetNextLines(int lines)
{
if (_sr == null)
return null;List<string> list = new List<string>();
string lineBuffer = string.Empty;
for (int i = 0; i < lines; i++)
{
lineBuffer = _sr.ReadLine();
if (string.IsNullOrEmpty(lineBuffer))
break;
list.Add(lineBuffer);
_currentLine++;
}
return list.ToArray();
}}
프로그램을 이전에 처리한 후 부터 다시 처리하고 싶을 경우 _currentLine 변수를 적절한 곳(레지스트리나 config 파일)에
저장해서 프로그램이 로드되는 시점에 SeekLine 함수를 불러주시면 될 것 같습니다.
그러나 여러 쓰레드에서 GetNextLines 함수를 불러서 사용할 경우 주의하셔야 합니다.
"프로그래밍 / TIP& Study" 분류의 다른 글
| [퀴즈] SQLite collate 문제 (0) | 2010/07/16 |
| [TIP] XP, Vista에서 CD/DVD롬이 보이지 않을 경우 (0) | 2009/08/05 |
| [C#] WinForm 에서 Docking 순서 변경하기 (0) | 2009/07/29 |
| [WPF] InkCanvas 사용하기 (0) | 2009/06/29 |
| [C#] Control Library 만들 때 TIP (0) | 2009/06/26 |
| [C#] 자연스럽게 Pen으로 그리기 (0) | 2009/06/23 |
| [WPF] Canvas의 Width, Height Binding (0) | 2009/06/23 |
| [C#] DateTime으로 7일 후는 어떻게? (0) | 2009/06/23 |
Program.cs
test.zip
댓글을 달아 주세요
안녕하세요 앞전에 질문을드렸는데 이렇게 강좌까지 올려주시니 많은도움이 되네요
질문은 끝이 없나봅니다 한가지질문더 드릴께요/;;;
윈폼에 웹브라우저를 하나 얹어놓고 웹페이지를 로드햇습니다.
윈폼에는 텍스트에 링크가 걸려있구요 클릭하면, 로드된 웹페이지의 자바스크립트를 실행하고 싶은데요.
어떻게 해야 하는지 통 모르겠네요..
<form id='updateStatusForm' action='gogo' method='POST'>
input.............
input..............
<a href='#' onclick='return processSubmit(1);' class='link_txt'>고고싱</a>
</form>
이럴때
WebBrowser1.Document.InvokeScript("processSubmit(1)");
이렇게 하니까 암반응이 없어서...
HtmlElement ele = WebBrowser1.Document.CreateElement("script");
ele.SetAttribute("text", "processSubmit(1)");
WebBrowser1.Document.Body.AppendChild(ele);
이렇게도 해보고....
WebBrowser1.Document.InvokeScript("processSubmit", new object[] { 1 });
이렇게도 해보았습니다....그런데도 안되네요 일주일째 이부분에서 진도가 안나가네요
그냥 텍스트링크를 클릭하는 효과를 줄까생각했는데 어케해야할지 이건 감을 못잡겠더라고요
하수의 고민을 해결하여 주시면 대단히 감사하겠습니다
해결하셨다니 다행입니다. ^^
Object[] args = new Object[1];
args[0] = 1;
WebBrowser1.Document.InvokeScript("processSubmit", args);
해결을 하였네요 윗질문에 제가 자답을 -_-;; (아직중수도 아닌데)
참고로 한가지 또 질문을 ㅋㅋㅋ;;;
저게 외 안되었었냐 하면 웹페이지로딩이 완전히 되지 않은상태에서 저걸 체크하니 안되었더라고요
값찍는다고 바로 윗줄에 messagebox.show 해서 그 메시지확인한다고 쩜 뜸들이다가 넘어가니 되더라고요
해서 궁금한질문이 모냐하면 베이직에선
Sleep 1
이렇게 초마다 대기를 시키는 명령어가 있는데요
물론 api함수인건데요
api 호출단을 보면 Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
이렇게 선언이되어있고
저걸
이제 불러와서 대기를 시키는거 같습니다
예를들면
브라우져로딩중.....(3개의 페이지를 거쳐서 마무리로딩이되더군요)
Sleep 10 ... 그래서 10초를 주고 최종 url 로 다운로드컴플리트가되면...
브라우져로딩되곳에 위에 함수를 실행을 시켜준다...
그런데 c# 에선 어떻게 대기를 시켜줘야하는 명령어를 써야하는지 모르겠습니다
타이머를 걸어봤는데 타이머는 타이머대로가고 자기동작을 하고 있고 바로 아랫줄이 실행이 들어가서 이건
아닌거 같더라고요
대기지연시간을 줘야하는데 고수님의 조언을 기다립니다
System.Threading.Thread.Sleep(int millisecond)
C#에서는 위의 함수를 사용해보시기 바랍니다.
그리고 WebBrowser 컨트롤은 문서가 로드되었을 때DocumentCompleted 라는 이벤트가 발생됩니다.
이 이벤트가 발생하였을 때 WebBrowser 객체의 IsBusy 프로퍼티를 확인해보시기 바랍니다.
IsBusy가 true인 경우 로드할 페이지가 남았다는 것을 의미하겠지요.
iframe 등을 html 페이지에 사용할 경우 DocumentCompleted 이벤트가 여러번 발생합니다.
안녕하십니까 간만에 또하나 질문을 드리려고 합니다
<select name="FOLDER" onClick="auto_del()">
<option value="">- 편지함 선택 -</option>
<option value="1111" >1111
<option value="2222" >2222
<option value="3333" >3333
<option value="4444" >4444
<option value="5555" >5555 </option>
<option value="6666" >6666</option>
</select>
이렇게 서버측에 스크립트가 있습니다
제가 하고자 하는작업은
6666을 선택하고자합니다
Object[] args = new Object[1];
args[0] = "this.selected";
WebBrowser1.Document.InvokeScript("auto_del", args);
해봤는데 안되고 또는
WebBrowser1.Document.GetElementById("FOLDER").InvokeMember("6666");
해봤는데 안되고...
WebBrowser1.Document.GetElementById("FOLDER").InnerText = "6666.selected";
이것저것 다해봤는데 안되네요.....
어떻게 해야 6666을을 자동으로 선택하게 할수있을까요?
http://chaoskcuf.com/entry/C-HTML-ltselectgt-option-동적으로-바꾸기 아티클을 참고하세요~
WebBrowser1_DocumentCompleted 최상위프레임( 페이지) 문서로딩확인방법좀 알려주세요
private void wbMain_DocumentComplete(object sender, AxSHDocVw.DWebBrowserEvents2_DocumentCompleteEvent e)
{
SHDocVw.WebBrowser pDispWebBrowser = e.pDisp as SHDocVw.WebBrowser;
if (pDispWebBrowser != null)
{
mshtml.IHTMLDocument2 objDocument2 = (IHTMLDocument2)pDispWebBrowser.Document;
if (objDocument2 == this.wbMain.Document)
{
//** 프로그램 메세지 출력
this.navigationLogWrite(MessageType.Message, "최상위 페이지 또는 프레임셋의 이동이 완료되었습니다.", objDocument2.url);
}
}
}
=======================================================================================
닷넷 2003쓰인 소스를 참고하여 2005에 적용하려고 하는데요
아래처럼 수정을 해보려고 시도하였는데 지식이 딸려서 어케해야할지 모르겠군요
이것을 SHDocVw를 쓰지않고 닷넷2.0 에서 자체지원하는 웹브라우져컨트롤을 사용하였습니다
microstft.mshtml 은 역시 닷넷 2.0 에 있는것으로 하였고요
프레임이 많아서 documentcomplete 가 많이 일어나는데 지정한주소의 프레임이 documentcomplete가
되었을때 파싱을 하려고 합니다
단순대기타이머로는 여러가지 에로사항이 많더군요
조언좀 부탁드립니다
=======================================================================================
private void WebBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
//SHDocVw.WebBrowser pDispWebBrowser = e.pDisp as SHDocVw.WebBrowser;
//if (pDispWebBrowser != null)
//{
mshtml.IHTMLDocument2 objDocument2 = (IHTMLDocument2)WebBrowser1.Document;
if (objDocument2 == WebBrowser1.Document)
{
//** 프로그램 메세지 출력
this.navigationLogWrite(MessageType.Message, "최상위 페이지 또는 프레임셋의 이동이 완료되었습니다.", objDocument2.url);
}
//}
}
약간 동문서답이긴 한데
아래의 방법으로 한번 해보세요~
http://chaoskcuf.com/entry/c-webbrowser ··· EB%B2%95
안녕하세여 c# 초보프로그러머인데요
또질문하나드리려고요 ^^;;
중복제거에관한건데요 텍스트화일이
aa
aa
bb
bb
이렇게 있다고 할경우 저 텍스트화일을 중복제거해서
aa
bb
이렇게만 결과물이 나오게하려면 어떻게 해야하나요?
쉬운거 같으면서도 막상코딩하려니 로직이 감이 잘 안잡히네요 ㅠ.ㅠ
답변부탁드립니다
http://chaoskcuf.com/entry/C-파일에서-중복을-제거하는-방법
위의 URL에 포스팅했습니다.
참으로 오랜만이네요 ^^
한동안 귀찮케 해드리다가 그럭저럭 제가 지내다가 다시 난관에
부딛혔습니다 ㅠ.ㅠ
---------------------------------
post 로 값을 던졌습니다.....그리고...
HttpWebRequest를 이용하여 얻어진 쿠키값을 이용하여 WebBrowser를 사용하고 싶습니다.
HttpWebRequest HTTP = (HttpWebRequest)WebRequest.Create("로그인 URL");
HTTP.CookieContainer = new CookieContainer();
HTTP.Method = "POST";
HTTP.ContentType = "application/x-www-form-urlencoded";
MemoryStream bufferStream = new MemoryStream();
byte[] LoginParamattaBytes = System.Text.Encoding.GetEncoding("EUC-KR").GetBytes("ID=aa&PW=bb");
bufferStream.Write(LoginParamattaBytes, 0, LoginParamattaBytes.Length);
HTTP.ContentLength = bufferStream.Length;
bufferStream.WriteTo(HTTP.GetRequestStream());
bufferStream.Close();
LoginCookie = HTTP.CookieContainer; <== 로그인후 쿠키값 LoginCookie
위 HttpWebRequest를 이용하여 얻어진 쿠키값을 이용하여 webBrowser1에 접속하고싶습니다.
webBrowser1.Navigate("로그인 쿠키값이 필요한 URL");<-이렇게 제응용플에서 저쿠키를 가져와 로그인유지하며 다른페이지로 가려고 합니다....
도와주십시요;;;
저도 이런 상황이 많이 필요한데
제가 흔히 쓰는 방법은
C#을 사용하는 방법이 아니라 MFC를 이용하는 방법입니다.
C#은 일일이 쿠키값을 세팅해서 전달해 주어야 하지만
MFC의 CInternetSession 과 관련된 통신 class를 사용하면 쿠키를 일일이 세팅하지 않았도 자동으로 전달되기 때문에 편리합니다.
도움이 될지 모르시겠지만 참고하시기 바랍니다.