在C#中向字符串添加一个字符

Adding a character to a string in C#

我不是 C# 的新手,我一直在使用字符串,但我不明白为什么在这种情况下我不能向简单的字符串添加简单的字符! 我正在尝试将文本文件读入 C#,以便稍后将其插入 SQL 服务器 table。 无论如何,我坚持在字符串中添加单引号字符。我的代码如下:

string text;

using (var streamReader = new StreamReader(@"The_Directory\myTextFile.txt", Encoding.UTF8))
{
    text = streamReader.ReadToEnd();
}

string[] lines = text.Split(new Char[] { '\n' });
string rearrange;

foreach (string line in lines)
{
     rearrange = "*" + line + "'";
     Console.WriteLine(rearrange);  
}

我得到的结果不包含我想添加到字符串末尾的字符,只包含我想添加到末尾的字符。

输出是这样的:

'The first line
'The second line

我不明白为什么它不执行简单的字符串加法。我试图过滤掉行中任何可能的附加 \n 字符,但没有帮助。

2 件事。尝试 string.split 和 stringsplitoptions.RemoveEmptyEntries。 对于 StringBuilding,请使用 StringBuilder 而不是连接它。

正如@Olivier 所指出的,您在 \n 而不是 \r\n 上分裂。这可能意味着您阅读的每一行末尾仍有一个 \r 字符 (carriage return)。结果输出是:

*The first line\r'
*The second line\r'

在典型的终端仿真器上显示为:

'The first line
'The second line

如果您可以减慢终端输出速度,您会看到 * 最初位于该行的开头,然后被 '.

覆盖

摆脱混乱的一种方法是去除尾随空格:

rearrange = "*" + line.TrimEnd() + "'";

注意:其中的 None 适用于在 'classic' Mac 上生成的文件,其中换行符是没有换行符的回车符 return。 我建议关注 .

只需在“拆分”中尝试以下小修改:

    string text;
    using (var streamReader = new StreamReader(@"The_Directory\myTextFile.txt",Encoding.UTF8))
    {
        text = streamReader.ReadToEnd();
    }

    string[] lines = text.Replace("\r\n","\n").Split("\n");
    string rearrange;
    foreach (string line in lines)
    {
        rearrange = "*" + line + "'";
        Console.WriteLine(rearrange);
    }

通常,一个普通的 (Windows) UTF-8 文本文件在每一行的末尾都有两个 \r\n。如果仅按 \n 拆分,则剩余的 \r 将保留,并且在控制台上显示 \r 的结果是光标跳到当前行的开头,然后显示下一个字符。因此,它会在显示更多文本时用以下字符覆盖该行。

试试这个:

using System.IO;

string[] lines = File.ReadAllLines("The_Directory\myTextFile.txt", Encoding.UTF8);

string rearrange;

foreach (string line in lines)
{
  rearrange = "*" + line + "'";
  Console.WriteLine(rearrange);  
}

在 Windows 上,新行是 Environment.Newline = "\r\n"

仅在 '\n' 上拆分导致剩余的 '\r' 意味着转到当前行的开头,并且 * 在输出时被 ' 替换到控制台,因此结果。

因为历史上在 DOS 中 \n 导致光标只在列中向下移动,如果我没记错的话,但我不确定,所以也需要 \r .

https://fr.wikipedia.org/wiki/Carriage_Return_Line_Feed