C#写入TXT文件时实现评论区按字数断行且不拆分单词
问题:评论区内容超过20字符时按完整单词自动换行
现状与需求
- 需求:使用
filename.WriteLine()写入TXT文件时,评论/叙述区内容超过20字符自动换行,且不拆分单词 - 当前错误效果(单词被拆分):
$$REMIT:Our Ref Your Ref DOA Reg No. Amount Comments $$REMIT:-------------------------------------------------------------------- $$REMIT:REFERENCE 01/01/1900 AAAAAAA 50.0000 Full & Final Settlem $$REMIT: ent
- 期望效果(保持单词完整):
$$REMIT:Our Ref Your Ref DOA Reg No. Amount Comments $$REMIT:-------------------------------------------------------------------- $$REMIT:REFERENCE 01/01/1900 AAAAAAA 50.0000 Full & Final $$REMIT: Settlement
注:必须匹配现有文件格式,否则其他程序无法读取。
当前使用代码
string formatDate = Convert.ToDateTime(PaymentsOutput.IncidentDate_date).ToString("dd/MM/yyyy").TrimEnd(); // Column Names outputFile.WriteLine("$$REMIT:" + "Our Ref".PadRight(12) + "Your Ref".PadRight(12) + "DOA".PadRight(12) + "Reg No.".PadRight(12) + "Amount".PadRight(12) + "Comments".PadRight(12)); // Line Separator outputFile.WriteLine("$$REMIT:".PadRight(76,'-')); // Column Content outputFile.Write("$$REMIT:" + PaymentsOutput.ClaimRef_char.PadRight(12) + PaymentsOutput.YourRef_char.PadRight(12) + formatDate.PadRight(12) + PaymentsOutput.RegNo_char.PadRight(12) + PaymentsOutput.PaymentAmount_money.ToString().PadRight(12)); int countNarative = PaymentsOutput.Narative_char.Length; if (countNarative > 20) { do { outputFile.WriteLine(PaymentsOutput.Narative_char.Substring(0, 20)); countNarative = countNarative - 20; outputFile.WriteLine("$$REMIT:".PadRight(68) + PaymentsOutput.Narative_char.Substring(20)); } while (countNarative > 20); } else { outputFile.WriteLine(PaymentsOutput.Narative_char); }
解决方案
核心逻辑是在20字符范围内找到最后一个空格的位置作为换行点,确保单词完整。替换原有评论区处理代码即可:
// Column Content outputFile.Write("$$REMIT:" + PaymentsOutput.ClaimRef_char.PadRight(12) + PaymentsOutput.YourRef_char.PadRight(12) + formatDate.PadRight(12) + PaymentsOutput.RegNo_char.PadRight(12) + PaymentsOutput.PaymentAmount_money.ToString().PadRight(12)); string narrative = PaymentsOutput.Narative_char.Trim(); int maxLength = 20; if (narrative.Length > maxLength) { // 找到20字符内最后一个空格的位置 int splitIndex = narrative.LastIndexOf(' ', maxLength); // 兜底:如果无空格,直接按20字符拆分 if (splitIndex == -1) splitIndex = maxLength; // 写入第一行评论 outputFile.WriteLine(narrative.Substring(0, splitIndex)); string remaining = narrative.Substring(splitIndex).Trim(); // 循环处理剩余内容 while (remaining.Length > maxLength) { splitIndex = remaining.LastIndexOf(' ', maxLength); if (splitIndex == -1) splitIndex = maxLength; outputFile.WriteLine("$$REMIT:".PadRight(68) + remaining.Substring(0, splitIndex)); remaining = remaining.Substring(splitIndex).Trim(); } // 写入最后一段内容 if (!string.IsNullOrEmpty(remaining)) { outputFile.WriteLine("$$REMIT:".PadRight(68) + remaining); } } else { outputFile.WriteLine(narrative); }
代码说明
- 精准换行:通过
LastIndexOf(' ', maxLength)锁定20字符内的最后一个空格,保证单词不被拆分 - 异常兜底:如果20字符内无空格(如超长连续字符),直接按20字符拆分,避免逻辑阻塞
- 格式对齐:后续行用
"$$REMIT:".PadRight(68)维持原有缩进格式,匹配其他程序的读取要求
内容的提问来源于stack exchange,提问作者TomHolden
相关产品推荐
相关产品推荐

