2013-08-04 2 views
-3

아래의 방법으로 데이터가 포함 된 텍스트 파일이 있습니다.이 파일을 C#을 사용하여 열 방향으로 읽으려고합니다.텍스트 파일을 열 방향으로 읽는 중

tvID |acdID| logonID |agentName  |modify |exception|start|stop |externalID 
70118349|1 |19131187356|Reed,Debrielle |1375205999|Open  |12:33|14:25|USWDER59 
70118349|1 |19131187356|Reed, Debrielle|1375213297|Meeting |14:25|14:39|USWDER59 
70118349|1 |19131187356|Reed, Debrielle|1375214248|Open  |14:39|15:07|USWDER59 
70118349|1 |19131187356|Reed, Debrielle|1375215830|Break |15:07|15:21|USWDER59 

예를 들어 I는 다음과 같이 시작 헤더 아래에있는 모든 데이터를 갖고 싶어 :

start  
12:33  
14:25  
14:39  
15:07 

이 사람이 나를 도울 수있다. (|)

+0

가장 좋은 방법은 데이터에 대한 데이터 구조를 정의하고 전체 파일을 읽고 (또는 적어도 부분은 당신이 원하는)에 아마 그 구조에 그런 다음 메모리에서 해당 구조와 상호 작용하고 필요에 따라 조작 할 수 있습니다. – David

+0

[TextFieldParser] (http://msdn.microsoft.com/en-us/library/microsoft.visualbasic.fileio.textfieldparser.aspx) 시도하십시오 ... – rene

+0

그것은 데이터를 읽지 않으려는 것 같습니다 하나의 열에 만 열을가합니다. 이것이 사실이라면 데이터 행렬을 라인 단위로 읽고 라인을 "|"로 나누면됩니다. 인덱스 6을 참조하십시오. 또는 실제 데이터 세트의 행을 배열로 사용하는 경우 인덱스 6 만 참조하면됩니다. – Michael

답변

1

당신은 열 구분하여 각 분할, 라인별로 라인을 읽어해야

string [] columns; 
using(StreamReader sr = new StreamReader("path_to_file")) 
{ 
    line=sr.ReadLine().Split('|'); 
    if(line.Length>6) 
     //line[6] is your time data 
     //Do something with this 
} 
1

파일이 순차적 장치이며, 당신이 그것을 문자로 문자를 읽을 필요 - 직접적인 방법이 없다 그것을 메모리로 처리합니다.

당신은 라인별로 라인을 읽고 다음 String.Split 함수를 호출 한 다음 필드에 액세스 할 수 있습니다 당신이 필요합니다

var lines = File.ReadLines(fileName); 
foreach (var line in lines) 
{ 
    var fields = line.Split(new char[]{ '|' }); 
    System.out.println(fields[6]); // Use appropriate index here. 
} 
1

가장 좋은 방법은 데이터에 대한 데이터 구조를 정의하고 (전체 파일을 읽을 아마 또는 적어도 원하는 부분)을 해당 구조로 가져올 수 있습니다. 그런 다음 메모리에서 해당 구조와 상호 작용하고 필요에 따라 조작 할 수 있습니다.

그런 다음
public class SomeObject // give it a more meaningful name, of course 
{ 
    public DateTime Start { get; set; } 
    public DateTime Stop { get; set; } 
} 

당신은 아마도 응용 프로그램에서 얻는 주어진 문자열 (에서 드 직렬화 클래스에 정적 공장을 추가 할 것 : 예를 들어

, 당신은 같은 클래스를 정의 정의 할 수 있습니다 클래스 자체는 파일에 대한 지식이 없으므로 파일 내부의 데이터이므로). 그것은 reading all the lines from the file처럼 간단 할 수 있으며, 라인의 열거를 그 팩토리 메소드에 전달합니다. 그런 다음 해당 팩토리 메소드가 데이터에 대해 parse each line이됩니다. 그것은 데이터처럼 보이는

는 파이프 delimeted, 그래서 이런 식으로 뭔가 좋은 시작이 될 수 있습니다 당신은 아마도에 TryParse를 사용하여 입력을 확인하는 몇 가지 오류를 추가 할 수 있습니다

public static SomeObject Deserialize(IEnumerable<string> input) 
{ 
    var result = new SomeObject(); 

    foreach (var dataLine in input.Skip(1)) 
    { 
     var dataElements = dataLine.Split('|'); 
     result.Start = DateTime.Parse(dataElements.Skip(6).First()); 
     result.Stop = DateTime.Parse(dataElements.Skip(7).First()); 
    } 

    return result; 
} 

데이터를 항상 직접 파싱 할 수없는 경우 여기에 약간의 방어 프로그래밍이 필요합니다. 그러나 당신은 아이디어를 얻습니다.

그런 다음 메모리에서 데이터를 조작하는 것은 간단합니다. 이러한 개체 목록에서, 예를 들어, Start 열을 얻을 수 있습니다 :

var startTimes = listOfObjects.Select(o => o.Start);