반응형
안녕하세요 한주현 입니다
여러분들 잘 지내시나요?
저는 요새 생각하는 기능들이 들어있고, 생각하는 대로 척척 잘 만들어 주는 C#의 매력에 빠져있습니다 ㅎㅎ
오늘은 C# 의 파일 쓰고 읽기에 대해 알아보겠습니다.
준비물
Visual Studio
EGFR 유전자 서열
https://raw.githubusercontent.com/KennethJHan/SampleData/master/EGFR_NC_000007.14_GRCh38.fasta
1. 개요
파일을 쓰고 읽는 것은 어느 프로그래밍 언어에서나 기본적인 내용인데요
C# 에서 어떻게 파일을 다루는지 오늘 정리해보겠습니다!!
먼저 한 번에 쓰고 읽는 방법에 대해서 알아보고,
그 다음 대용량의 파일을 다룰 수 있도록 한 줄씩 쓰고 읽는 방법에 대해서도 알아보겠습니다.
그리고 배운것을 활용하여 주어진 FASTA 파일의 GC content ratio 를 계산하는 프로그램도 만들어 봅시다 ㅎㅎ
나름 생물정보학 블로그 이니 간단한 예제로 해봅시다 ㅎㅎ..
2. 한 번에 쓰고, 한 번에 읽기
File 클래스의 WriteAllText 메서드를 사용하여 내용을 한 번에 쓰고
File 클래스의 ReadAllText 메서드를 사용하여 내용을 한 번에 읽을 수 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | using System; using System.IO; namespace FileWrite { class Program { static void Main(string[] args) { // 파일 한 번에 쓰고 읽기 File.WriteAllText("test1.txt", "Write File at once!"); Console.WriteLine(File.ReadAllText("test1.txt")); // Write File at once! } } } | cs |
"한 번에" 란 말은 메모리에 쓰거나 읽을 내용을 전부 올려두었다가,
파일에 쓰거나, 읽는 다는 말입니다 ㅎㅎ..
작은 파일이면 이렇게 해도 상관은 없습니다만,
만약 파일이 대용량으로 크다면 메모리에 부담이 가겠죠?
3. 한 줄씩 쓰고, 한 줄씩 읽기 - 추천하는 방법
파일을 한 번에 쓰고 읽게 되면, 사이즈가 큰 파일의 경우 메모리에 부담이 가게 됩니다 ㅎㅎ..
그런 파일을 다루겠냐 싶지만, 실제로 현업에 있다보면 경우가 왕왕 있습니다.
또한 한 줄 씩 처리 할 때 더 편한 경우도 많기에 한 줄 씩 다루는 방법을 추천합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | using System; using System.IO; namespace FileWrite { class Program { static void Main(string[] args) { // Stream 으로 쓰기 using (StreamWriter streamWriter = new StreamWriter("test1.txt")) { streamWriter.WriteLine("Hello"); streamWriter.WriteLine("StreamWriter Test"); streamWriter.WriteLine("Write Sentences with multilines"); for (int i = 0; i < 5;i++) { streamWriter.WriteLine(i + " - for loop"); } } // Stream 으로 읽기 using (StreamReader reader = new StreamReader("test1.txt")) { string line; while((line = reader.ReadLine()) != null) { Console.WriteLine(line); } } // Hello // StreamWriter Test // Write Sentences with multilines // 0 - for loop // 1 - for loop // 2 - for loop // 3 - for loop // 4 - for loop } } } | cs |
4. C# 으로 만든 GC ratio (%) 계산기
한 줄 씩 읽는 방법을 활용하여 ㅎㅎ..
FASTA 서열의 GC ratio 를 계산해봅시다
FASTA 파일은 아래 그림과 같이
> 로 시작하는 헤더가 있고 A, C, G, T 염기 서열이 일정한 개수의 라인으로 구성된 텍스트 형태의 파일입니다.
우리는 FASTA 서열에서 A, C, G, T 염기를 읽어서 전체 서열 중 GC(%) 가 얼마나 되는지 계산해 볼겁니다.
EGFR 유전자 서열
https://raw.githubusercontent.com/KennethJHan/SampleData/master/EGFR_NC_000007.14_GRCh38.fasta
한꺼번에 읽어서 헤더를 제거하기 보다는
한 줄 씩 읽어서 > 가 출현하면 읽지 않는 방식으로 가보죠.
그냥 메인 메서드에 다 몰아서 구현해봤습니다..
string 의 StartsWith 메서드를 사용하여 > 헤더를 골라내었구요
베이스를 센 것들은 int 형이기에 (double)로 형변환 해주었습니다.
Math.Round로 소수점 반올림 하였구요.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | using System; using System.IO; namespace GCContentCalculator { class Program { static void Main(string[] args) { int a = 0; int c = 0; int g = 0; int t = 0; int all = 0; double gc = 0.0; using (StreamReader reader = new StreamReader("EGFR_NC_000007.14_GRCh38.fasta")) { string line; while ((line = reader.ReadLine()) != null) { if (line.StartsWith('>')) { } else { foreach(char ch in line) { if (ch == 'A') { a += 1; } else if (ch == 'C') { c += 1; } else if (ch == 'G') { g += 1; } else if (ch == 'T') { t += 1; } } } } } Console.WriteLine("A: "+a + "\nC: " + c + "\nG: " + g + "\nT: " + t); all = a + c + g + t; gc = Math.Round(((c + g) / (double)(all) * 100),2); Console.WriteLine("GC ratio(%): " + gc + "%"); // A: 51511 // C: 42774 // G: 41558 // T: 53217 // GC ratio(%): 44.61% } } } | cs |
그렇게 어렵지 않게 FASTA 파일을 읽어냈습니다 ㅎㅎ
오늘은 C# 의 파일 쓰고 읽기에 대해 알아보았습니다.
FASTA 파일도 읽어서 GC(%) 를 계산도 해보았구요.
여러분들께 도움이 되셨음 좋겠네요 ㅎㅎ
- 참고
Document 는 우리의 언제나 늘 좋은 친구 ㅎㅎ
paypal 기부 버튼을 만들었습니다
여러분들의 작은 정성이 저에게 큰 힘이 됩니다
기부해주신 분들을 기억하며
더 좋은 내용으로 보답해 드리겠습니다 :)
Donate 버튼은 paypal 결제로 paypal 계정이 없으시더라도
카드로도 기부 가능하십니다 :)
Use your credit card or bank account (where available). 옆의 continue 를 누르시면 됩니다
한주현 드림
반응형
댓글