x01.TextProc: 兩三分鐘完成的一個小工具,一門進球兩三個
在工作中,遇到這麼個問題,需要將 Excel 表中類似 2134-1234-4456 的商品編號輸入到單位的程序中,而程序只認 213412344456 這種沒有 ‘-’ 的輸入。數量比較多,一筆一筆的敲,費時費力不可取,所以轉換一下,復制粘貼,不僅可以提高速度,而且也不易出錯。並且,由於 Excel 表是別人提供,可能反復遇到此問題,所以寫個轉換的小工具是必要的。
直接操作 Excel 嗎?問題 ”矮小下“,顯然用不著這麼麻煩。我的方法是,將商品編號列復制粘貼到記事本中保存為 temp.txt 文件。現在問題一下子就簡化為普通的文本處理了。新建一個 WPF 程序,其 MainWindow.xaml 和 MainWindow.xaml.cs 內容如下:

![]()
<?xml version="1.0" encoding="utf-8"?>
<Window
x:Class="TextProc.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Text Proc"
Height="380"
Width="500"
WindowStartupLocation="CenterScreen">
<StackPanel>
<ScrollViewer
Height="300"
VerticalScrollBarVisibility="Auto">
<TextBox
Name="txtContent"
Margin="5" />
</ScrollViewer>
<StackPanel
Orientation="Horizontal"
HorizontalAlignment="Right">
<Button
Name="btnSelect"
Content="_Select" />
<Button
Name="btnProcess"
Content="_Process" />
</StackPanel>
</StackPanel>
</Window>
MainWindow.xaml

![]()
/**
* MainWindow.xaml.cs (c) 2015 by x01
* ----------------------------------
*/
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using Microsoft.Win32;
namespace TextProc
{
/// <summary>
/// Interaction logic for Window1.xaml
/// </summary>
public partial class MainWindow : Window
{
string _path = null;
OpenFileDialog _dlg = new OpenFileDialog();
public MainWindow()
{
InitializeComponent();
_dlg.Filter = "*.txt|*.txt|*.*|*.*";
btnProcess.Click += delegate {
if (string.IsNullOrEmpty(_path)) return;
var text = File.ReadAllText(_path);
text = ProcessText(text);
txtContent.Text = text;
File.WriteAllText(_path + ".proc", text);
MessageBox.Show("Process Text Success!");
};
btnSelect.Click += delegate {
_dlg.ShowDialog();
_path = _dlg.FileName;
txtContent.Text = File.ReadAllText(_path);
};
}
// 主要的文本處理邏輯,換行作分割,只保留數字,可根據實際情況調整。
private string ProcessText(string text)
{
string [] arr = text.Split('\n');
List<string> result = new List<string>();
foreach (var a in arr) {
char[] cs = a.ToCharArray();
string s = string.Empty;
for (int i = 0; i < cs.Length; i++) {
if (cs[i] < '0' || cs[i] > '9') continue;
s += cs[i].ToString();
}
result.Add(s);
}
string str = string.Empty;
foreach (var r in result) {
str += r + "\n";
}
return str;
}
}
}
MainWindow.cs
由於是在 XP 系統用 SharpDev 編寫,所以 xaml 文件稍有不同。
處理後,再復制回 Excel 表中。花個兩三分鐘就解決了問題,還是不錯的。
在 windows10 和 vs2015 這兩個巨無霸來臨之際,作為編程愛好者,不要忘了,編程是為了解決問題這一本質,是為記。
我也是醉了,Ctl + H 即可解決,竟然寫了個程序!之所以如此,是因為我幾乎從來不用 Ctl+H 來全部替換:一不小心改了不該改的數據,在單位可不是小問題。
解決問題的方法從來都不是一種,還是予以保留吧,因為我的出發點是解決 Excel 問題,並不一定要操作 Excel。