1

ゲノムの大きなシーケンスを取得したので、それを小さな.txtファイルに分割する必要があります。

シーケンスは次のようになります

>supercont1.1 of Geomyces destructans 20631-21
AGATTTTCTTAATAACTTGTTCAATGTGTGTTCAAATGATATGCCGTGATGTATGTAGCA
TAAACAGATGTAGTAGAAGAGTTTGCAGCAATCGTTGAGTAGTATTGCTTCTGTTGTTGG
>supercont1.2 of Geomyces destructans 20631-21
AGATTTTCTTAATAACTTGTTCAATGTGTGTTCAAATGATATGCCGTGATGTATGTAGCA
TAAACAGATGTAGTAGAAGAGTTTGCAGCAATCGTTGAGTAGTATTGCTTCTGTTGTTGG
TAAACAGATGTAGTAGAAGAGTTTGCAGCAATCGTTGAGTAGTATTGCTTCTGTTGTTGG
>supercont1.3 of Geomyces destructans 20631-21
AGATTTT (...)

また、「1.1-Geomyces-destructans--20631-21」、「1.2-Geomyces ...」という名前の小さなファイルに分割して、ゲノムデータを入力する必要があります。

@JimMischelヘルプの後の私のコードは次のようになります。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace genom1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        string filter = "Textové soubory|*.txt|Soubory FASTA|*.fasta|Všechny soubory|*.*";

        private void doit_Click(object sender, EventArgs e)
        {
            bar.Value = 0;

            OpenFileDialog opf = new OpenFileDialog();

            // filter for choosing file types
            opf.Filter = filter;

            string lineo = "error"; // test

            if (opf.ShowDialog() == DialogResult.OK)
            {
                var lineCount = 0;
                using (var reader = File.OpenText(opf.FileName))
                {
                    while (reader.ReadLine() != null)
                    {
                        lineCount++;
                    }
                }

                bar.Maximum = lineCount;
                bar.Step = 1;

                FolderBrowserDialog fbd = new FolderBrowserDialog();

                fbd.Description = "Vyber složku, do které chceš rozdělit načtený soubor: \n\n" + opf.FileName; // dialog desc
                if (fbd.ShowDialog() == DialogResult.OK)
                {
                    List<string> lines = new List<string>();
                    foreach (var line in File.ReadLines(opf.FileName))
                    {
                        bar.PerformStep();

                        if (line[0] == '>')
                        {
                           if (lines.Count >= 0)
                            {
                                // write contents of lines list to file

                                //quicker replace for better file name
                                StringBuilder prep = new StringBuilder(line);
                                prep.Replace(">supercont", "");
                                prep.Replace("of", "");
                                prep.Replace(" ", "-");
                                lineo = prep.ToString();

                                // append or writeall? how to writeall lines without append?
                                //System.IO.File.WriteAllText(fbd.SelectedPath + "\\" + lineo + ".txt", lineo);
                                StreamWriter SW;
                                SW = File.AppendText(fbd.SelectedPath + "\\" + lineo + ".txt");

                                foreach (string s in lines)
                                    {
                                        SW.WriteLine(s);
                                    }

                                SW.Close();

                                // and clear the list.
                                lines.Clear();
                            }
                        }
                        lines.Add(line);
                    }
                    // here, do the last part
                    if (lines.Count >= 0)
                    {
                        // write contents of lines list to file.

                        /* starts being little buggy here...

                        StreamWriter SW;
                        SW = File.AppendText(fbd.SelectedPath + "\\" + lineo + ".txt");
                        foreach (string s in lines)
                        {
                            SW.WriteLine(s);
                        }
                        SW.Close();

                        */
                    }
                }

            }
        }

    }
}
4

2 に答える 2

2

ファイルがメモリに収まるほど大きい場合は、を呼び出しFile.ReadAllTextて文字列に収めることができます。次に、文字間のテキストを調べて抽出します>。何かのようなもの:

string s = File.ReadAllText("filename");
int pos = s.IndexOf('>');
while (pos != -1)
{
    int newpos = s.IndexOf('>', pos+1);
    string text = s.Substring(pos+1, newpos - pos);
    // now write text to a file

    // update current position
    pos = newpos;
}
// here you'll have to handle the last part of the file specially.

ファイルに正しく名前を付ける方法を理解できると思います。

ファイル全体をメモリに収めることができない場合は、ファイルを1文字ずつ読み取るか、何らかのバッファリングを行うことができます。>が常に行の先頭にあることがわかっている場合、問題はより簡単になります。次に、次のように書くことができます。

List<string> lines = new List<string>();
foreach (var line in File.ReadLines("filename"))
{
    if (line[0] == '>')
    {
        if (lines.Count > 0)
        {
            // write contents of lines list to file.
            // and clear the list.
            lines.Clear();
        }
    }
    lines.Add(line);
}
// here, do the last part
if (lines.Count > 0)
{
    // write contents of lines list to file.
}
于 2012-04-16T23:44:35.127 に答える
1

最も簡単な方法は、最初にFile.ReadAllText()を使用してファイル全体を読み取ることです。次に、String.Split( ">")を使用します。これにより、新しいファイルの内容と思われる配列が返されます。

于 2012-04-16T23:44:23.847 に答える