*.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;
}
}
Encoding.GetEncoding("GB2312") 或 Encoding.Default。[\s\S]*? 非貪婪匹配多行,結束條件看下一個 # 開頭或文件結尾 \Z。\s+ 匹配任意空白。File.ReadLines 流式逐行讀取,狀態機解析,避免一次性 ReadAllText 爆內存。using (var bulk = new SqlBulkCopy(connStr)) {
bulk.DestinationTableName = "ExamRank";
bulk.WriteToServer(dt);
}
SqlBulkCopy 批量寫入 SQL Server,速度比逐行 INSERT 快 10-100 倍。