public bool AddFramesTrackFile(string inputFile, string outputFile, int addFrames, bool onTail)
        {
            _state = "Loading";
            bool    ret        = true;
            TrackIO trackIn    = new TrackIO();
            int     trackWidth = 0;

            using (StreamReader reader = new StreamReader(inputFile)) {
                trackIn.LoadTrack(reader);
                try {
                    // 無名マーカーも含めたマーカー数
                    // 実際には配列長より\tの数のほうが正しいらしい
                    trackWidth = reader.ReadLine().Split('\t').Length / 3;
                } catch (IOException) { }
            }
            trackWidth = Math.Max(trackWidth, trackIn.NumMarkers);
            TrackIO trackOut = trackIn.Clone() as TrackIO;

            trackOut.NumFrames += addFrames;
            // 一行読んだのでもう一回
            using (StreamReader reader = new StreamReader(inputFile)) {
                trackIn.LoadTrack(reader);
                using (StreamWriter writer = new StreamWriter(outputFile)) {
                    trackOut.WritePreHeader(writer);
                    trackOut.WriteMarkerHeader(writer);
                    if (onTail)
                    {
                        while (!reader.EndOfStream)
                        {
                            writer.WriteLine(reader.ReadLine());
                        }
                    }
                    for (int i = 0; i < addFrames; i++)
                    {
                        writer.Write("0\t0\t");     // 適当に
                        for (int j = 0; j < trackWidth; j++)
                        {
                            writer.Write("\t\t\t");
                        }
                        writer.WriteLine();
                    }
                    if (!onTail)
                    {
                        while (!reader.EndOfStream)
                        {
                            writer.WriteLine(reader.ReadLine());
                        }
                    }
                }
            }
            _state = "Finished";
            return(ret);
        }
        /// <summary>
        /// Tracked ASCIIファイルを指定されたフレーム数以下のフレームを含む複数のファイルに分割します。
        /// </summary>
        /// <param name="filename">分割ファイル名</param>
        /// <param name="limit">各出力ファイルのフレーム数の上限</param>
        /// <returns>ファイルを分割する必要があったか</returns>
        /// <exception cref="System.IO.InvalidDataException"></exception>
        /// <exception cref="System.ArgumentException"></exception>
        /// <exception cref="System.IO.IOException"></exception>
        /// <exception cref="System.IO.PathTooLongException"></exception>
        /// <exception cref="System.IO.DirectoryNotFoundException"></exception>
        /// <exception cref="System.IO.FileNotFoundException"></exception>
        public bool SplitTrackFile(string filename, int limit)
        {
            _state = "Loading";
            using (StreamReader reader = new StreamReader(filename)) {
                this.LoadTrack(reader);
                int split = (int)Math.Ceiling((double)this.NumFrames / limit);
                if (split <= 1)
                {
                    return(false);
                }

                int lineCnt   = 0;
                int restLines = this.NumFrames;
                int onceLines = (int)Math.Ceiling((double)restLines / split);
                for (int i = 0; i < split && restLines > 0; i++)
                {
                    string outfile = GetSplitFilename(filename, i + 1);
                    using (StreamWriter writer = new StreamWriter(outfile)) {
                        TrackIO track = this.Clone() as TrackIO;
                        if (onceLines > restLines)
                        {
                            onceLines = restLines;
                        }
                        track.NumFrames = onceLines;
                        track.FilePath  = outfile;

                        track.WritePreHeader(writer);
                        track.WriteMarkerHeader(writer);
                        int j = 0;
                        try {
                            for (j = 0; j < onceLines; j++)
                            {
                                lineCnt++;
                                _state = new StringBuilder().AppendFormat("Line {0} / {1}", lineCnt.ToString(), this.NumFrames.ToString()).ToString();
                                writer.WriteLine(reader.ReadLine());
                            }
                        } catch (IOException) {
                            restLines = 0;
                        }
                        restLines -= j;
                    }
                }
            }
            _state = "Finished";
            return(true);
        }
        public bool CutFramesTrackFile(string inputFile, string outputFile, int cutFrames, bool onTail)
        {
            _state = "Loading";
            bool    ret     = true;
            TrackIO trackIn = new TrackIO();

            using (StreamReader reader = new StreamReader(inputFile)) {
                trackIn.LoadTrack(reader);
                TrackIO trackOut = trackIn.Clone() as TrackIO;
                trackOut.NumFrames -= cutFrames;
                if (trackOut.NumFrames < 0)
                {
                    trackOut.NumFrames = 0;
                }
                using (StreamWriter writer = new StreamWriter(outputFile)) {
                    trackOut.WritePreHeader(writer);
                    trackOut.WriteMarkerHeader(writer);
                    if (onTail)
                    {
                        for (int i = 0; i < trackOut.NumFrames && !reader.EndOfStream; i++)
                        {
                            writer.WriteLine(reader.ReadLine());
                        }
                    }
                    else
                    {
                        for (int i = 0; i < cutFrames && !reader.EndOfStream; i++)
                        {
                            reader.ReadLine();
                        }
                        while (!reader.EndOfStream)
                        {
                            writer.WriteLine(reader.ReadLine());
                        }
                    }
                }
            }
            _state = "Finished";
            return(ret);
        }
Esempio n. 4
0
        /// <summary>
        /// 複数のTracked ASCIIファイルを横に結合します。
        /// マーカーセット名がつけられてない部分は放棄されます。
        /// </summary>
        /// <param name="inputFiles">入力ファイル名の配列</param>
        /// <param name="outputFile">出力先ファイル名</param>
        /// <returns>エラーがないか</returns>
        /// <exception cref="System.IO.InvalidDataException"></exception>
        /// <exception cref="System.ArgumentException"></exception>
        /// <exception cref="System.ArgumentNullException"></exception>
        /// <exception cref="System.IO.IOException"></exception>
        /// <exception cref="System.IO.PathTooLongException"></exception>
        /// <exception cref="System.IO.DirectoryNotFoundException"></exception>
        /// <exception cref="System.IO.FileNotFoundException"></exception>
        public bool LinkFiles(string[] inputFiles, string outputFile)
        {
            _state = "Loading";
            bool ret = true;

            if (inputFiles == null)
            {
                throw new ArgumentNullException("inputFiles is null");
            }
            if (inputFiles.Length == 0)
            {
                throw new ArgumentException("inputFiles has no element");
            }
            StreamReader[] readers = new StreamReader[inputFiles.Length];
            try {
                // 入力ファイルを開く
                TrackIO[] tracks = new TrackIO[inputFiles.Length];
                for (int i = 0; i < inputFiles.Length; i++)
                {
                    readers[i] = new StreamReader(inputFiles[i]);
                    tracks[i]  = new TrackIO();
                    tracks[i].LoadTrack(readers[i]);
                }
                // 出力トラックファイルのヘッダーを設定
                TrackIO outTrack = tracks[0].Clone() as TrackIO;
                outTrack.FilePath   = outputFile;
                outTrack.NumMarkers = 0;
                foreach (var track in tracks)
                {
                    outTrack.NumMarkers += track.NumMarkers;
                }
                List <string> outMarkers = new List <string>();
                for (int i = 0; i < inputFiles.Length; i++)
                {
                    string prefix = Path.GetFileNameWithoutExtension(inputFiles[i]) + "_";
                    foreach (var marker in tracks[i].Markers)
                    {
                        outMarkers.Add(prefix + marker);
                    }
                }
                outTrack.Markers    = outMarkers.ToArray();
                outTrack.NumMarkers = outTrack.Markers.Length;
                // フレーム数チェック
                for (int i = 0; i < inputFiles.Length; i++)
                {
                    if (tracks[i].NumFrames != outTrack.NumFrames)
                    {
                        throw new InvalidDataException("Frame Length of Track Files mismatch. :" + inputFiles[i]);
                    }
                }
                // 書き込み
                using (StreamWriter writer = new StreamWriter(outputFile)) {
                    outTrack.WritePreHeader(writer);
                    outTrack.WriteMarkerHeader(writer);
                    try {
                        int lineCnt = 0;
                        while (true)
                        {
                            // 全部EOFなら終わり
                            if (readers.All(x => { return(x.EndOfStream); }))
                            {
                                break;
                            }
                            lineCnt++;
                            _state = new StringBuilder().AppendFormat("Line {0} / {1}", lineCnt.ToString(), outTrack.NumFrames.ToString()).ToString();
                            // 各行の出力
                            string[] markerValues = new string[outTrack.NumMarkers * 3];
                            for (int i = 0; i < markerValues.Length; i++)
                            {
                                markerValues[i] = "";
                            }
                            string frame = "", time = "";
                            int    markerOffset = 0;
                            for (int i = 0; i < inputFiles.Length; i++)
                            {
                                if (!readers[i].EndOfStream)
                                {
                                    string[] lines = readers[i].ReadLine().Split('\t');
                                    if (frame == "" && lines.Length >= 2)
                                    {
                                        frame = lines[0];
                                        time  = lines[1];
                                    }
                                    try {
                                        for (int j = 0; j < tracks[i].NumMarkers * 3; j++)
                                        {
                                            markerValues[j + markerOffset] = lines[j + 2];
                                        }
                                    } catch (IndexOutOfRangeException) { }
                                }
                                markerOffset += tracks[i].NumMarkers * 3;
                            }
                            if (frame != "")
                            {
                                writer.Write("{0}\t{1}\t", frame, time);
                                foreach (var value in markerValues)
                                {
                                    writer.Write("{0}\t", value);
                                }
                                writer.WriteLine();
                            }
                        }
                    } catch (IOException) { ret = false; }
                }
            } finally {
                foreach (var reader in readers)
                {
                    if (reader != null)
                    {
                        reader.Dispose();
                    }
                }
            }
            _state = "Finished";
            return(ret);
        }
        /// <summary>
        /// 複数のTracked ASCIIファイルを縦につなげます。
        /// </summary>
        /// <param name="inputFiles">入力ファイルの配列</param>
        /// <param name="outputFile">出力先ファイル名</param>
        /// <returns></returns>
        public bool ConcatTrackFile(string[] inputFiles, string outputFile)
        {
            _state = "Loading";
            bool ret = true;

            if (inputFiles == null)
            {
                throw new ArgumentNullException("inputFiles is null");
            }
            if (inputFiles.Length == 0)
            {
                throw new ArgumentException("inputFiles has no element");
            }
            StreamReader[] readers = new StreamReader[inputFiles.Length];
            try {
                // 入力ファイルを開く
                TrackIO[] tracks = new TrackIO[inputFiles.Length];
                for (int i = 0; i < inputFiles.Length; i++)
                {
                    readers[i] = new StreamReader(inputFiles[i]);
                    tracks[i]  = new TrackIO();
                    tracks[i].LoadTrack(readers[i]);
                }
                // 出力トラックファイルのヘッダーを設定
                TrackIO outTrack = tracks[0].Clone() as TrackIO;
                outTrack.FilePath  = outputFile;
                outTrack.NumFrames = 0;
                foreach (var track in tracks)
                {
                    outTrack.NumFrames += track.NumFrames;
                }
                // マーカー数チェック
                for (int i = 0; i < inputFiles.Length; i++)
                {
                    if (tracks[i].NumMarkers != outTrack.NumMarkers)
                    {
                        throw new InvalidDataException("Marker Length of Track Files mismatch. :" + inputFiles[i]);
                    }
                }
                using (StreamWriter writer = new StreamWriter(outputFile)) {
                    outTrack.WritePreHeader(writer);
                    outTrack.WriteMarkerHeader(writer);
                    int readerCnt = 0;
                    foreach (var reader in readers)
                    {
                        int lineCnt = 0;
                        while (!reader.EndOfStream)
                        {
                            lineCnt++;
                            _state = new StringBuilder().AppendFormat("Line {0} / {1}, File {2} / {3}", lineCnt.ToString(), this.NumFrames.ToString(), (readerCnt + 1).ToString(), readers.Length.ToString()).ToString();
                            writer.WriteLine(reader.ReadLine());
                        }
                        readerCnt++;
                    }
                }
            } finally {
                foreach (var reader in readers)
                {
                    if (reader != null)
                    {
                        reader.Dispose();
                    }
                }
            }
            _state = "Finished";
            return(ret);
        }