首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

LINQ 進階查詢實戰:正則解析城市區號資料入庫

     編輯:ASP.NET 基礎

案例背景

將包含城市名稱與區號的多行文本字串,透過 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 匹配中文
ForEachList.ForEach(Action)批次執行插入

優化建議

  1. 參數化查詢:避免 SQL 注入,改用 ADOHelper.ExecuteCommand(sql, parameters)。
  2. 批次執行:大量資料用 SqlBulkCopy 或 Table-Valued Parameters,而非逐筆 ExecuteCommand。
  3. 資料來源外部化:城市區號資料放入 .txt/.csv/資料庫,而非硬編碼於類別字串。
  4. LINQ to SQL / Entity Framework:使用 ORM 取代手寫 SQL,獲得型別安全與變更追蹤。

總結

本例展示 LINQ 結合正則表達式進行非結構化文本解析、轉換、入庫的完整流程。Aggregate 單次遍歷建立字典效能佳;Unicode 正則精準提取中文。實務專案請加強參數化、批次寫入、資料外部化等工程化實踐。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved