2019년 3월 16일 토요일

파일처리

텍스트파일을 IEnumeralbe<string>으로 취급한다.

  var filePath = @"C:/Example/Greeting.txt";
        var lines = File.ReadLines(filePath, Encoding.UTF8);
        foreach (var line in lines)
            Debug.Log("line" + line);

ReadLines를 이용하며니 LINQ를 조합해서 다채로운 처리를 깨끗하게 할 수 있다.

1.첫  n행을 읽는다.

   var lines = File.ReadLines(filePath, Encoding.UTF8)
                        .Take(10)
                        .ToArray();

첫 10행만 읽어 들입니다.
ReadAllLines 메서드와는 달리 파일의 마지막까지 읽어 들이지는 않습니다(중요).

2. 조건에 일치하는 행의 개수를 센다.

var count = File.ReadLines(filePath, Encoding.UTF8)
                    .Count(s => s.Contains("Windows"));

Windows라는 문자열이 포함돼 있는 행의 개수를 셉니다.

3.조건에 일치하는 행만 읽어 들인다.

var lines = File.ReadLines(filePath, Encoding.UTF8)
                        .Where(s => !string.IsNullOrWhiteSpace(s))
                        .ToArray();

위의 코드는 빈 문자열이나 공백인 행 이외의 행을 읽을 수 있습니다.
IsNullOrWhiteSpace 메서드는  .NET 프레임워크 4 이후에 이용할 수 있는 메서드입니다.

4.조건에 일치하는 행이 존재하는지 여부를 조사한다.

var exists = File.ReadLines(filePath, Encoding.UTF8)
                    .Where(s => !string.IsNullOrWhiteSpace(s))
                    .Any(s => s.All(c => char.IsDigit(c)));

숫자로만 구성된 행이 존재하는지 조사합니다. 빈 행이 존재하면 조건에 일치한다고 판단되지 않도록 미리 where 메서드를 기술하지 않으면 빈 행에 대해서도 s.ALL이 호출되어 true를 만환하므로 미리 where로 거름

5.중복된 행을 제외하고 나열한다.

var lines = File.ReadLines(filePath, Encoding.UTF8)
                        .Distinct()
                        .OrderBy(s => s.Length)
                        .ToArray();


중복된 행을 제외하고 행의 길이가 짧은 순서로 정렬한 후에 배열에 저장합니다.

6.행마다 어떤 변환 처리를 실행한다.
읽어 들인 행에 어떤 변환 처리를 수행하는 예제.
택스트 파일에서 읽어 들인 각 행에 행 번호를 붙이는 코드.

var lines = File.ReadLines(filePath)
            .Select((s, ix) => string.Format("{0,4}: {1}", ix + 1, s))
            .ToArray();
        foreach (var line in lines)
            Debug.Log(line);


7.기존 텍스트 파일의 첫머리에 행을 삽입하는 기능

var filePath = @"C:/Example/Greeting.txt";
        using (var stream = new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite, FileShare.None))
        {
            using (var reader = new StreamReader(stream))
            using (var writer = new StreamWriter(stream))
            {
                string texts = reader.ReadToEnd();
                stream.Position = 0;
                writer.WriteLine("삽입할 새 행1");
                writer.WriteLine("삽입할 새 행1");
                writer.Write(texts);
            }
        }









댓글 없음:

댓글 쓰기

git rejected error(feat. cherry-pick)

 문제 아무 생각 없이 pull을 받지않고 로컬에서 작업! 커밋, 푸시 진행을 해버렷다. push에선 remote와 다르니 당연히 pull을 진행해라고 하지만 로컬에서 작업한 내용을 백업하지 않고 진행하기에는 부담스럽다(로컬작업 유실 가능성) 해결하려...