You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
}

代码说明

  1. 精准换行:通过LastIndexOf(' ', maxLength)锁定20字符内的最后一个空格,保证单词不被拆分
  2. 异常兜底:如果20字符内无空格(如超长连续字符),直接按20字符拆分,避免逻辑阻塞
  3. 格式对齐:后续行用"$$REMIT:".PadRight(68)维持原有缩进格式,匹配其他程序的读取要求

内容的提问来源于stack exchange,提问作者TomHolden

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 06:32:27