【问题标题】:How to read double quotes (") in a text file in C#?如何在 C# 中读取文本文件中的双引号 (")?
【发布时间】:2012-01-12 14:28:55
【问题描述】:

我必须读取一个文本文件,然后在 C# 中使用 VS 2010 对其进行解析。示例文本如下,

[TOOL_TYPE]

; provides the name of the selected tool for programming

“Phoenix Select Advanced”;

[TOOL_SERIAL_NUMBER]

; provides the serial number for the tool

7654321;

[PRESSURE_CORRECTION]

; provides the Pressure correction information requirement

 “Yes”;

[SURFACE_MOUNT]

; provides the surface mount information

“Yes”;

[SAPPHIRE_TYPE]

; provides the sapphire type information

“No”;

现在我只需要解析字符串数据(双引号)和标题(方括号[]),然后将其保存到另一个文本文件中。可以成功解析headers,但是双引号中的字符串数据显示不正确,如下图。

[TOOL_TYPE]
�Phoenix Select Advanced�;
[TOOL_SERIAL_NUMBER]
7654321;
[PRESSURE_CORRECTION]
�Yes�;
[SURFACE_MOUNT]
�Yes�;
[SAPPHIRE_TYPE]
�No�;
[EXTENDED_TELEMETRY]
�Yes�;
[OVERRIDE_SENSE_RESISTOR]
�No�;

请注意每次出现双引号时都会出现一个特殊字符 (�)。

如何在目标文件中写入双引号(“)并避免(�)?

更新

我正在使用以下行进行解析

temporaryconfigFileWriter.WriteLine(configFileLine, false, Encoding.Unicode);

这是我正在使用的完整代码:

        string temporaryConfigurationFileName = System.Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\\Temporary_Configuration_File.txt";

        //Pointers to read from Configuration File 'configFileReader' and to write to Temporary Configuration File 'temporaryconfigFileWriter'
        StreamReader configFileReader = new StreamReader(CommandLineVariables.ConfigurationFileName);
        StreamWriter temporaryconfigFileWriter = new StreamWriter(temporaryConfigurationFileName);

        //Check whether the 'END_OF_FILE' header is specified or not, to avoid searching for end of file indefinitely
        if ((File.ReadAllText(CommandLineVariables.ConfigurationFileName)).Contains("[END_OF_FILE]"))
        {
            //Read the file untill reaches the 'END_OF_FILE'
            while (!((configFileLine = configFileReader.ReadLine()).Contains("[END_OF_FILE]")))
            {
                configFileLine = configFileLine.Trim();
                if (!(configFileLine.StartsWith(";")) && !(string.IsNullOrEmpty(configFileLine)))
                {
                    temporaryconfigFileWriter.WriteLine(configFileLine, false, Encoding.UTF8);
                }
            }
            // to write the last header [END_OF_FILE]
            temporaryconfigFileWriter.WriteLine(configFileLine);

            configFileReader.Close();
            temporaryconfigFileWriter.Close();
        }

【问题讨论】:

  • 您需要提供用于读取/解析/写入的源...我怀疑您在此过程中使用的编码有问题...
  • 向我们展示用于将文本写入输出文件的代码..

标签: c# parsing


【解决方案1】:

您的输入文件不包含双引号,这是一个谎言。它包含opening double quoteclosing double quote 不是标准版本。

首先,您必须确保使用正确的编码读取您的输入(尝试多个,然后在 C# 的文本框中显示字符串,您会看到它是否可以非常快速地正确显示字符)

如果您希望这样的字符出现在您的输出中,您必须将输出文件写为 ASCII 以外的其他内容,例如,如果您将其写为 UTF-8,则应确保它以字节顺序标记开头(否则它将可读,但某些软件(如记事本)会显示 2 个字符,因为它不会检测到文件不是 ASCII)。

另一种选择是简单地将 替换为"

【讨论】:

  • 是的,很抱歉说错了。我的文件有这些用于字符串识别的开始和结束引号。那么我如何确保将其正确写入其他文本文件。请参阅我对我正在使用的编码的解释并建议我解决方案。
  • @Asad:这就是为什么我说你用一个只将文本加载到文本框中的小软件来检查。 UTF-16 编码的文本文件真的很少见,大部分时间都是 UTF-8 在磁盘上(Encoding.UTF8
  • 我使用了所有四种编码 ASCII、UNICODE、UTF-8 和 UTF-16,但没有一个显示正确答案。是的,我正在将数据写为(记事本)文本文件。
  • @asad 您需要提供更多信息或自行调试。请参阅此代码:pastebin.com/BJRLXciu 它在使用放置在 UTF-8 文本文件中的文本时有效。所以问题出在代码中的其他地方,而不是在加载/保存中,或者您需要找到输入的编码。
【解决方案2】:

您似乎使用了正确的印刷引号 (“...”) 而不是直接的 ASCII 引号 ("...")。我的猜测是您使用错误的编码读取了文本文件。

如果您可以在记事本中正确看到它们,并且 ASCII 和任何一种 Unicode 编码都不起作用,那么它可能是代码页 1252。您可以通过

获得该编码
Encoding.GetEncoding(1252)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-28
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多