본문 바로가기
컴퓨터/C#

[C#] 파일 쓰고 읽기 - 파일 입출력 - FASTQ GC content ratio 계산기 - 생물정보학

by HanJoohyun 2018. 6. 10.
반응형

 

 


안녕하세요 한주현 입니다

여러분들 잘 지내시나요? 
저는 요새 생각하는 기능들이 들어있고, 생각하는 대로 척척 잘 만들어 주는 C#의 매력에 빠져있습니다 ㅎㅎ

오늘은 C# 의 파일 쓰고 읽기에 대해 알아보겠습니다.







준비물



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(%) 가 얼마나 되는지 계산해 볼겁니다.




한꺼번에 읽어서 헤더를 제거하기 보다는 

한 줄 씩 읽어서 > 가 출현하면 읽지 않는 방식으로 가보죠.


그냥 메인 메서드에 다 몰아서 구현해봤습니다..

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: "++ "\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 를 누르시면 됩니다

한주현 드림







반응형

댓글