如图,本人有一个文件1.txt
想根据行标识#a#,#b#,#c#等(有很多行,数量不定,但 都是此规律)拆分成单个以#号中中间字符命名的txt文件存放到磁盘下。效果如下所示:
想根据行标识#a#,#b#,#c#等(有很多行,数量不定,但 都是此规律)拆分成单个以#号中中间字符命名的txt文件存放到磁盘下。效果如下所示:
解决方案
10
class Program { static void Main(string[] args) { var lines = File.ReadAllLines("c:\source.txt"); var processedLines = new List<string>(); var name = string.Empty; foreach (var line in lines) { if(IsStartLine(line)) { if(processedLines.Count > 0) { File.WriteAllLines(name, processedLines); processedLines.Clear(); } name = GetFileName(line); } else { processedLines.Add(line); } } if (processedLines.Count > 0) { File.WriteAllLines(name, processedLines); processedLines.Clear(); } } public static bool IsStartLine(string l) { return l.StartsWith("#") && l.EndsWith("#"); } public static string GetFileName(string l) { return l.Substring(1, l.Length - 2); } }
怎么感谢本人。
5
晚了一步。 楼上的方案比本人的好。用他的吧。
5
if (str.Length == 3 && str[0] == "#" && str[2] == "#") { fileCount++; file = @"C:\testDir" + str[1] + ".txt"; if(sw!=null) { sw.Flush();sw.Close();sw.Dispose(); } sw = new StreamWriter(file, false); }
加上这段
50
/// <summary> /// 拆分txt /// </summary> /// <param name="fileName">原始文件路径</param> /// <returns>拆分文件数</returns> public static int SplitTxt(string fileName) { using (StreamReader sr = new StreamReader(fileName)) { int fileCount = 0;//文件数 string str = string.Empty;//原始文件每行数据 string file = string.Empty;//拆分文件名 StreamWriter sw = null; while ((str = sr.ReadLine()) != null) { if (str.Length == 3 && str[0] == "#" && str[2] == "#") { fileCount++; file = @"C:\testDir" + str[1] + ".txt"; if (sw != null) { sw.Close(); } sw = new StreamWriter(file, false); continue; } //写入文件 if (sw != null && File.Exists(file)) sw.WriteLine(str); } if (sw != null) { sw.Flush(); sw.Close(); sw.Dispose(); } return fileCount; } }
已测试通过,你可以本人在优化一下。
5
foreach(Match m in Regex.Matches(File.ReadAllText(YOURFILENAME), @"#(\w+)#\r\n([^#]+)")) File.WriteAllText(m.Groups[1].Value + ".txt", m.Groups[2].Value);
5
假如换行符不是\r\n,第一行里本人替换下
假如有输出路径,加到第二行m.Groups[1].Value + “.txt”的前面
15
ASHX版的,把路径一段改下就可以了
string filename = ""; StringBuilder builder = new StringBuilder(); string path = ""; public void ProcessRequest(HttpContext context) { path = context.Server.MapPath("."); string[] lines = File.ReadAllLines(context.Server.MapPath("1.txt")); foreach (string line in lines) { if (line.StartsWith("#")) { writeFile(); filename = line.Substring(1, 1) + ".txt"; } else { builder.AppendLine(line); } } writeFile(); } void writeFile() { string content = builder.ToString(); if (content != "") { File.WriteAllText(path + "\" + filename, content); } builder.Clear(); }
5
一事一议比较好
static void Main(string[] args) { string name = ""; char[] fmt = { "#" }; foreach (var r in fileGet("1.txt")) { var buf = r.Trim(fmt); if (buf != r) name = buf + ".txt"; else filePut(name, buf); } } static IEnumerable<string> fileGet(string fileName) { using (StreamReader sr = new StreamReader(fileName)) { string buf; while ((buf = sr.ReadLine()) != null) yield return buf; } } static void filePut(string fileNmae, string content) { using (var sw = new StreamWriter(fileNmae, true)) { sw.WriteLine(content); } }