2013-08-15 5 views
0

텍스트 파일에서 특정 문자열을 가져 와서 변수에 넣으려고합니다. 이 텍스트 파일의 구조가이 하나 개의 라인을 명심 모습입니다 각 라인은 다음과 같습니다과 빈 라인으로 구분됩니다 :텍스트 파일에서 특정 문자열 읽기

Date: 8/12/2013 12:00:00 AM Source Path: \\build\PM\11.0.64.1\build.11.0.64.1.FileServerOutput.zip Destination Path: C:\Users\Documents\.NET Development\testing\11.0.64.1\build.11.0.55.5.FileServerOutput.zip Folder Updated: 11.0.64.1 File Copied: build.11.0.55.5.FileServerOutput.zip 

내가 무엇을 완전히 너무 확실하지 않았다 이 텍스트 파일의 구분 기호로 사용하거나 심지어 구분 기호를 사용하여 변경 될 수 있더라도 사용해야합니다.

그래서 내가 원하는 일에 대한 간단한 예제는 목적지 경로를 가져 와서 strDestPath와 같은 변수에 저장하려고합니다.

은 전반적으로 지금까지 함께했다 코드는 이것이다 :

//find the variables from the text file 
string[] lines = File.ReadAllLines(GlobalVars.strLogPath); 

그래별로지만, 내가 무엇을 찾고 있었다 난 그냥 한 번에 한 줄을 읽고 검색하려고하면 나는 아마 생각 해당 회선을 통해하지만 솔직히 난 내가 그렇게 여부를 고수하는 경우는 ... 100 % 확신하지

은 파일이 얼마나 큰에 대해 회의적인 경우
+0

종류는 파일 크기에 따라 다릅니다. 매우 큰 파일의 경우 who 파일이 메모리에 저장되므로, 한 번에 한 줄씩 파일을 읽는 것이 좋습니다. –

+0

도움이 될 것입니다. http://stackoverflow.com/a/1271236/328193 – David

답변

4

, 당신은 지연됩니다 ReadLines를 사용하여 와야한다 ReadAllLines 대신 실행 :

다음과 같이
var lines = File.ReadLines(GlobalVars.strLogPath); 

ReadLinesReadAllLines 방법다를 : 당신이 readlines 메쏘드를 사용하면 전체 컬렉션을 반환되기 전에

, 당신은 문자열의 컬렉션을 열거 시작할 수 있습니다; ReadAllLines를 사용할 때 배열에 액세스하기 전에 전체 문자열 배열이 반환 될 때까지 기다려야합니다. 따라서 매우 큰 파일로 작업 할 때 ReadLine이 더 효율적일 수 있습니다.

+0

팁 주셔서 감사합니다! – user2619395

2

이상하게 들릴 수도 있지만 파서를 로깅해야합니다. 파일 형식을 자유롭게 설정할 수 있다면 로그 파서에 맞는 파일 형식을 사용할 수 있습니다. 믿어 주시면 삶이 훨씬 쉬워 질 것입니다.

일단 로그 구문 분석을 사용하여 파일을로드하면 사용자가 원하는 정보를 얻을 수 있습니다. 프로젝트에서 interop을 사용하지 않을 경우 com 참조를 추가하고 .net 프로젝트에서 사용할 수도 있습니다.

이 샘플은 거대한 csv 파일을 읽고 DB에 일괄 처리를 수행하여 마지막 단계를 수행합니다. 이것은 정말 사실이 아니다, 그러나 그 Microsoft는이 숨겨진 보석과 모르는 대부분의 사람들 중 하나에 LOGPARSER로

COMTSVInputContextClass logParserTsv = new COMTSVInputContextClass(); 
COMSQLOutputContextClass logParserSql = new COMSQLOutputContextClass(); 
logParserTsv.separator = ";"; 
logParserTsv.fixedSep = true; 

logParserSql.database = _sqlDatabaseName; 
logParserSql.server = _sqlServerName; 
logParserSql.username = _sqlUser; 
logParserSql.password = _sqlPass; 
logParserSql.createTable = false; 
logParserSql.ignoreIdCols = true; 

// query shortened for clarity purposes 
string SelectPattern = @"Select TO_STRING(UserName),TO_STRING(UserID) INTO {0} From {1}"; 

string query = string.Format(SelectPattern, _sqlTable, _csvPath); 
logParser.ExecuteBatch(query, logParserTsv, logParserSql); 

LogParser와를이 작업을 수행하는 것이 얼마나 쉬운 지 보여줍니다. iis 로그, CSV 파일, txt 파일 등을 읽을 수 있습니다. 그래픽을 생성 할 수도 있습니다!

그냥 당신이 토크 나이를 만들 필요가 같은 http://support.microsoft.com/kb/910447/en

+0

+1 C#을 조금 숨겨진 원더 - LogParser를 사용하지 않을 것임을 알고 있습니다. – Saggio

+0

오, 감사합니다! – user2619395

1

이 보이는 여기를 확인하십시오.이런 식으로 뭔가를 시도 :

토큰 값 목록 정의 : 토큰을 찾을 수있는 방법을 만들기

public class Token 
{ 
    private readonly string _tokenText; 
    private string _val; 
    private int _begin, _end; 

    public Token(string tk, int beg, int end) 
    { 
    this._tokenText = tk; 
    this._begin = beg; 
    this._end = end; 
    this._val = String.Empty; 
    } 

    public string TokenText 
    { 
    get{ return _tokenText; } 
    } 

    public string Value 
    { 
    get { return _val; } 
    set { _val = value; } 
    } 

    public int IdxBegin 
    { 
    get { return _begin; } 
    } 

    public int IdxEnd 
    { 
    get { return _end; } 
    } 
} 

:

List<Token> FindTokens(string str) 
{ 
List<Token> retVal = new List<Token>(); 
if (!String.IsNullOrWhitespace(str)) 
{ 
    foreach(string cd in gTkList) 
    { 
    int fIdx = str.IndexOf(cd); 
    if(fIdx > -1) 
     retVal.Add(cd,fIdx,fIdx + cd.Length); 
    }  
} 
return retVal; 
} 

List<string> gTkList = new List<string>() {"Date:","Source Path:" }; //...etc. 

을 토큰 클래스를 만듭니다 그런 다음 다음과 같이하십시오.

foreach(string ln in lines) 
{ 
//returns ordered list of tokens 
var tkns = FindTokens(ln); 
for(int i=0; i < tkns.Length; i++) 
{ 
    int len = (i == tkns.Length - 1) ? ln.Length - tkns[i].IdxEnd : tkns[i+1].IdxBegin - tkns[i].IdxEnd; 
    tkns[i].value = ln.Substring(tkns[i].IdxEnd+1,len).Trim(); 
} 

//Do something with the gathered values 
foreach(Token tk in tkns) 
{ 
    //stuff 
} 
}