LoginSignup
1
2

More than 5 years have passed since last update.

Excelからコピペしてcsvにする簡易ツール

Posted at

要点

Excelのセルをコピーしたテキストはtsvなので、これをReplaceで置換してcsvに保存するチャレンジ。

経緯

作業効率化のために、Excelからcsvを吐き出したいものの、
昨今はセキュリティの都合上現場は外のネットワークに繋がらず、VBAのソースもコピペできないことも多いです。
さて困ったけど、どうやってcsvファイルを作ろうかと考えたとき、Excelからセルをコピーしたときの特徴を利用すればよいと分かりました。

Excelからコピーしたセルは、テキスト上ではtsvで持っているので、区切り文字を\tから,に置換すればよいのです。

完成品の外観

適当にテキストボックスを配置し
(※AcceptsEnter, AcceptsTabをオン(true)にしてください)
CSV_00.PNG

セルをコピーして
CSV_01.PNG

ペッと貼り付けるとファイルパスが出るので開くと
CSV_02.PNG

一瞬でcsvファイルの出来上がり!
CSV_03.PNG

通常版とワンライナー版

通常版

CopyTsvToCsv_Normal.cs
string[] sepArr = new string[] { "\r\n" }; // Split用
string toCsv = content.Replace("\t", ","); // tsv→csvへ
string[] lines = toCsv.Split(sepArr, StringSplitOptions.RemoveEmptyEntries); // 行を分割
File.WriteAllLines(fi.FullName, lines); // 上の行を削除してFile.WriteAllText(fi.FullName, toCsv)でもOK

ワンライナー

CopyTsvToCsv_One-Liner.cs
File.WriteAllLines(fi.FullName, content.Replace("\t", ",").Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries));

応用プラン

  • ファイルパス、ディレクトリパスから変換できるようにしてもOK
    • 後日書きます

ソース

以下、上記のまとめです。

CopyTsvToCsv.cs

        private void TxbInputTsv_TextChanged(object sender, TextChangedEventArgs e)
        {
            DateTime dtNow = DateTime.Now;
            string fileName = string.Format("out_{0}.csv", dtNow.ToString("yyyyMMddHHmmss"));
            FileInfo fi = new FileInfo(Path.Combine(di.FullName, fileName));

            if (fi.Exists) return;

            OutPutCsv(fi, ((TextBox)sender).Text);
        }

        private void OutPutCsv(FileInfo fi, string content)
        {

            if (string.IsNullOrEmpty(content.Trim())) return;

            try
            {
                // ワンライナー版
                // File.WriteAllLines(fi.FullName, content.Replace("\t", ",").Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries));

                string[] sepArr = new string[] { "\r\n" };
                string toCsv = content.Replace("\t", ",");
                string[] lines = toCsv.Split(sepArr, StringSplitOptions.RemoveEmptyEntries);
                File.WriteAllLines(fi.FullName, lines);

                TxbInputTsv.Text = string.Format("Save: {0}", fi.FullName);
                Thread.Sleep(5000);
                TxbInputTsv.Text = "";
            }
            catch(Exception ex)
            {
                TxbInputTsv.Text = ex.ToString();
            }
        }
1
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2