在某些环境中文件中缺少字符

时间:2013-12-23 16:28:32

标签: c# file-io c#-2.0

这对我来说是一个全新的,我不知道从哪里开始。我有一个Dictionary子类,它从本地网络上的旧纯文本文件中加载数据以填充自己。

文件有一些标题行,然后是数据(每行用一行破折号分开),直到每页设定的行数(59),之后标题重复。

最近有人要求增加对最初不需要的数据的支持。此数据的标题列数不同。相反,我决定在每组数据中寻找一个特殊字符。代码如下所示:

/// <summary>
/// Load the work order information from the chart on the network.
/// </summary>
/// <param name="workOrder">Work order to load</param>
/// <param name="model">Model number of the work order to load. Loaded from MES if null.</param>
public WorkOrderInformation(String workOrder, String model)
{
    if (model == null)
        model = MES.getOrder(workOrder).Model;

    String fileLocation = Path.Combine(Path.Combine(WorkOrderLocation, model), workOrder.Insert(4, "-") + ".TXT");

    StreamReader file = new StreamReader(File.Open(fileLocation, FileMode.Open, FileAccess.Read));

    int currentLineNumber = 0;
    while (!file.EndOfStream)
    {
        string line = file.ReadLine();
        Logging.Log.writeLog(log, "Loaded line | " + line);
        currentLineNumber++;
        int lineOnPage =(currentLineNumber % 59);
        // Old way to determine if line contains data
        //if (lineOnPage >= 10 && lineOnPage % 2 == 0)
        if (line.Contains(((char)65533).ToString()))
        {
            Logging.Log.writeLog(log, "Line added to collection");
            string[] sections = line.Split(new char[] { '|' });

            if (sections.Length > 1)
            {
                UnitInfo newUnit = new UnitInfo(sections[0].Trim());
                for (int j = 1; j < sections.Length; j++)
                {
                    newUnit.Add(sections[j].Trim());
                }
                this.Add(newUnit.TestNumber,newUnit);
            }
        }
    }
    file.Close();
}

在我的开发机器(Windows 7)和一台部署机器(Windows 2000)上,它完美运行。在另一台部署机器(Windows XP)上,该字符根本不在该行中。如果我检查我的日志,当我记录整行时没有写入字符,并且没有达到记录“添加到集合中的行”的语句。

我在所有3台机器上的同一个文件上运行它。

修改

我已将日志记录更改为存储加载的行的长度而不是行本身,并确认string中的字符丢失了。在它运行的机器上,日志表示行的长度为65个字符,而不是64个字符的行。

编辑2:

我决定重新考虑这个问题。我没有搜索那个特殊字符,而是决定提前拆分字符串并检查第一个值是否为数字:

double dummy;
if(double.TryParse(sections[0],out dummy))

这让我的工作完成了,但我仍然很好奇为什么会这样,并且会留下这个问题,至少希望得到解释。

编辑3:

似乎比我想象的还要破碎。正如Dan指出的那样,我正在搜索的值(0xFFFD)实际上是replacement character,它显然不应该是。{{3}}。无法识别打印输出中的字符我在十六进制编辑器中打开文件,发现字符问题应该是0x00F8(ø)。

所以似乎StreamReader要么加载0x00F8作为替换字符,要么根本不加载。现在问题是为什么?

1 个答案:

答案 0 :(得分:0)

我非常好奇你是如何提出以下代码的:

if (line.Contains(((char)65533).ToString()))

Unicode 65533或0xFFFD是一个名为replacement character的特殊字符。该角色的目的是用来代替一些未知或无法代表的角色。

因此,它存在于一行文本中通常表示存在某些其他因某种原因无法再现的字符。原因可能是编码,字体等。

期待找到这个符号这一事实似乎是一个根本性的缺陷。你认为这个角色来自哪里?它将如何在文件中结束?