要点
Excelのセルをコピーしたテキストはtsvなので、これをReplaceで置換してcsvに保存するチャレンジ。
経緯
作業効率化のために、Excelからcsvを吐き出したいものの、
昨今はセキュリティの都合上現場は外のネットワークに繋がらず、VBAのソースもコピペできないことも多いです。
さて困ったけど、どうやってcsvファイルを作ろうかと考えたとき、Excelからセルをコピーしたときの特徴を利用すればよいと分かりました。
Excelからコピーしたセルは、テキスト上ではtsvで持っているので、区切り文字を\t
から,
に置換すればよいのです。
完成品の外観
適当にテキストボックスを配置し
(※AcceptsEnter, AcceptsTabをオン(true)にしてください)
通常版とワンライナー版
通常版
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();
}
}