首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C# 批量解析文本文件提取結構化數據入 DataTable 實戰

     編輯:程式設計疑難解答

需求

  • 目錄下多個 *.txt(如 張三.txt、李四.txt)。
  • 每文件包含相似結構片段:#考試排名# 開頭,後跟表頭與多行數據。
  • 需提取所有人的數據,增加「姓名」列(取文件名),匯總入 DataTable 或資料庫。

解決方案:正則 + 流式讀取

using System;
using System.Data;
using System.IO;
using System.Text.RegularExpressions;
using System.Collections.Generic;

public class TxtParser {
    public DataTable ParseAll(string folder) {
        var dt = new DataTable();
        dt.Columns.Add("姓名");
        dt.Columns.Add("日期");
        dt.Columns.Add("參加人數", typeof(int));
        dt.Columns.Add("環比增減", typeof(int));
        dt.Columns.Add("環比變化%", typeof(double));

        var files = Directory.GetFiles(folder, "*.txt");
        var regex = new Regex(@"#考試排名#\s+日期\s+參加考試人數\s+環比增減\s+環比變化%[\s\S]*?(?=\n\s*#|\Z)", RegexOptions.Multiline);
        var lineRegex = new Regex(@"(\d{4}-\d{2}-\d{2})\s+(\d+)\s+(-?\d+)\s+(-?\d+\.?\d*)");

        foreach (var file in files) {
            string name = Path.GetFileNameWithoutExtension(file);
            string content = File.ReadAllText(file, Encoding.Default); // 注意編碼
            Match m = regex.Match(content);
            if (!m.Success) continue;

            foreach (Match line in lineRegex.Matches(m.Value)) {
                var row = dt.NewRow();
                row["姓名"] = name;
                row["日期"] = line.Groups[1].Value;
                row["參加人數"] = int.Parse(line.Groups[2].Value);
                row["環比增減"] = int.Parse(line.Groups[3].Value);
                row["環比變化%"] = double.Parse(line.Groups[4].Value);
                dt.Rows.Add(row);
            }
        }
        return dt;
    }
}

關鍵技術點

  1. 編碼處理:中文舊文本常為 GB2312/GBK,用 Encoding.GetEncoding("GB2312") 或 Encoding.Default。
  2. 正則邊界:用 [\s\S]*? 非貪婪匹配多行,結束條件看下一個 # 開頭或文件結尾 \Z。
  3. 行內字段:假設列由空白分隔,\s+ 匹配任意空白。
  4. 大文件優化:改用 File.ReadLines 流式逐行讀取,狀態機解析,避免一次性 ReadAllText 爆內存。

入庫建議

using (var bulk = new SqlBulkCopy(connStr)) {
    bulk.DestinationTableName = "ExamRank";
    bulk.WriteToServer(dt);
}

SqlBulkCopy 批量寫入 SQL Server,速度比逐行 INSERT 快 10-100 倍。

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