將包含城市名稱與區號的多行文本字串,透過 LINQ + 正則表達式解析,轉為 Dictionary<string, string> 並批次寫入資料庫。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Data;
namespace SJLERP
{
public partial class WebForm1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
// 1. 以正則分行、去空白、解析中文+數字
var cityAndNum = Regex.Matches(City.Data, @"[^\r].*?\r")
.Cast()
.Select(m => Regex.Replace(m.Value, @"\s", "")) // 移除所有空白
.Aggregate(new Dictionary(), (dict, item) =>
{
// 匹配「中文+數字」格式:如「北京010」
if (Regex.IsMatch(item, @"[\u4e00-\u9fa5]+\d+"))
{
string city = Regex.Match(item, @"[\u4e00-\u9fa5]+").Value;
string code = Regex.Match(item, @"\d+").Value;
dict[city] = code;
}
return dict;
});
// 2. 建立資料表 (示範用,實際應用遷移腳本管理)
ADOHelper.ExecuteCommand("CREATE TABLE KaixuanTest (city VARCHAR(MAX), num VARCHAR(MAX))");
// 3. 批次插入
cityAndNum.ToList().ForEach(kvp =>
{
string sql = $"INSERT INTO KaixuanTest VALUES ('{kvp.Key}', '{kvp.Value}')";
ADOHelper.ExecuteCommand(sql);
});
}
}
public class City
{
public static string Data => @"北京區號
北京 010
天津區號
天津 022
河北區號
石家莊 0311
... (其餘省市區號資料) ...";
}
}
| 技術 | 用法 | 說明 |
|---|---|---|
| Regex.Matches | @"[^\r].*?\r" | 逐行匹配 (保留換行符) |
| Cast<Match>() | 轉為 IEnumerable<Match> | 啟用 LINQ 查詢 |
| Select + Regex.Replace | @"\s" | 移除每行空白字元 (含全形空格) |
| Aggregate | 種子 new Dictionary(), 累加器 lambda | 單次遍歷建立字典,避免中間集合 |
| Regex.IsMatch | @"[\u4e00-\u9fa5]+\d+" | 驗證「中文+數字」格式,過濾標題行 (如「北京區號」) |
| Regex.Match | 分別提取中文、數字 | 利用 Unicode 範圍 \u4e00-\u9fa5 匹配中文 |
| ForEach | List.ForEach(Action) | 批次執行插入 |
ADOHelper.ExecuteCommand(sql, parameters)。SqlBulkCopy 或 Table-Valued Parameters,而非逐筆 ExecuteCommand。本例展示 LINQ 結合正則表達式進行非結構化文本解析、轉換、入庫的完整流程。Aggregate 單次遍歷建立字典效能佳;Unicode 正則精準提取中文。實務專案請加強參數化、批次寫入、資料外部化等工程化實踐。