2016-10-18 7 views
0

큰 데이터 파일을 읽고 .dat 파일의 각 줄에서 특정 텍스트를 반환하는 응용 프로그램을 만듭니다. 아래 데이터의 예를 참조하십시오.일정한 양의 데이터를 읽음

22/06/2016 22 : 18 : 21.209은 TYPE6 -92.31435 2.06424 0.07686
22/06/2016 22 : 18 : 21.210 Type34 -91.4085

1.84464 -0.09333

는 I는 제 3 필요 날짜, 시간 및 유형 인 데이터 세트. 유형 이후의 값은 잠시 동안 지속되고 수집해야하는 많은 양의 행이 있습니다. 나는 라인의 각 부분을 나누고 첫 3 개의 필드를 취하는 것에 대해 생각해 봤다. 이 방법이 효과가 있습니까? 아니면 이것을 완료하는 쉬운 방법이 있습니까?

감사

+0

한 줄의 길이는 얼마나됩니까? –

+0

각 줄마다 Regex.Match 메서드를 사용하려고 했습니까? 샘플은 다음 위치에 있습니다. https://msdn.microsoft.com/pl-pl/library/twcw2f1c(v=vs.110).aspx – Misiakw

+0

한 줄의 길이는 공백을 포함하여 약 199 자이지만 다른 데이터를 포함 할 수 있습니다. 길거나 짧음 – Englishman

답변

1

올바른 방법을 사용하고 있습니다 (필드 3 개만 추출). 문맥 안에 Linq을 사용하는 것이 좋습니다.

var source = File 
    .ReadLines(@"C:\MyData.dat") 
    .Select(line => line.Split(new char[] { ' ' }, 4)) 
    .Where(items => items.Length >= 3) // it seems that you have empty lines or something 
    .Select(items => new { 
    // Let's combine date and time into DateTime 
    date = DateTime.ParseExact(items[0] + " " + items[1], 
           @"dd/MM/yyyy H:m:s.fff", 
           CultureInfo.InvariantCulture), 
    kind = items[2] }); 
// .ToArray(); // you may want add materialization (i.e. read once and put into array) 

는 및 원하는 데이터, 예를 들어, 대표 쉽게 필터 출력 할 수있는이 LINQ 쿼리를 가지고 데

var test = source 
    .Where(item => item.date > DateTime.Now.AddDays(-3)) // let's have fresh records only 
    .OrderByDescending(item => item.date) 
    .Select(item => $"{item.date} {item.kind}"); 

Console.Write(string.Join(Environment.NewLine, test)); 
+0

도움을 주셔서 감사합니다. 조금이라도 문제가 생기면 코드에 영향을 미치려고합니다. 아래 링크를 참조하십시오. – Englishman

+0

http://imgur.com/a/Tt1Ql – Englishman

+0

@Englishman : 파일에 * 빈 줄 *이있는 것 같습니다. 따라서 분할하면 너무 적은 항목 (빈 줄의 경우 0)이 반환되고 예외가 throw됩니다. 3d 아이템을 요청할 때'items [2]'에. 그런 줄을 배제하기 위해'.Where (items => items.Length> = 3)'을 추가하는 것이 좋습니다 –

0

당신은 단지 각 행의 첫 번째 문자를 읽고 뭔가를 만들 수 있지만, 당신은 모든 데이터를 읽을 그래서 라인의 길이가 어디 지정되지 않았습니다.

File.ReadLines(path)은 데이터를 느리게로드하기 때문에 사용해야합니다. 이것은 반복마다 한 행만로드합니다. 당신은 당신이 필요로하는 어떤 데이터를 확인하고 당신이 원하는대로에 저장해야 foreach는 라인 ...

var relevantData = new List<T>(); 
foreach(var line in File.ReadLines(path)) 
{ 
    // parse the data you need. 
    relevantData.Add(new T { Date = whatever, ..... }); 
} 

당신이 그것을 여러 번 분석해야하는 경우의 개시 인덱스를 포함하는 인덱스 파일을 만들 수 있습니다 각 라인.

관련 문제