子弹点未替换-CSV为XML

  • 本文关键字:XML -CSV 替换 子弹 c#
  • 更新时间 :
  • 英文 :


我正在读取CSV文件并将其转换为XML。问题是,要点,连字符等。我试图替换"•"以及其他未被"视为"有效的字符。当生成XML时,子弹点表示为正方形,实际上,未识别的任何东西都是正方形。当我从生成的XML复制"正方形"时,所有"特殊"角色都被"视为"是一个带有问号的黑色钻石。在XML输出中,它表示为"�"。我尝试了:

int i = (int)'•';
Console.WriteLine(i);

我看到了8226的值。

所以我尝试用" html for bullet"替换u8226,因此它将正确显示,但这行不通。

我以这种方式阅读了原始CSV:

string[] csvfile = File.ReadAllLines(inputFile).Skip(1).ToArray();

我正在阅读的文件不会很大,所以这就是为什么我正在阅读数组。

然后我在"上分开,给我转换为XML元素的列。如果我在Excel中打开文件并通过Excel手动进行替换,则无问题。我得到了预期的XML输出。我想以编程方式进行此操作。我没有任何问题在XML元素内使用常规文本进行替换,例如:

new XElement("elementName", columns[14].ToLower().Replace("yes", "1")

如果我尝试:

new XElement("elementName", columns[14].ToLower().Replace("•", "htmlReplacement")

什么都没有改变。

任何见解都会很棒!

这是我正在使用的代码:

//以下以下替换的正则表达式 - 这起作用

        string inputFile = @"pathTo.csv";
        string[] csvfile = File.ReadAllLines(inputFile).Skip(1).ToArray();
        XNamespace xsi = XNamespace.Get("http://www.w3.org/2001/XMLSchema-instance");
        XNamespace xsiNsl = XNamespace.Get("something.xsd");
        XElement jobs = new XElement("Root",
            new XAttribute(XNamespace.Xmlns + "xsi", xsi.NamespaceName),
            new XAttribute(xsi + "noNamespaceSchemaLocation", xsiNsl),
            from line in csvfile
            //let columns = line.Replace(", ", ", ").Replace(",0", ",0").Split(',')
            let columns = Regex.Replace(Regex.Replace(Regex.Replace(Regex.Replace(line, dPat, rdPat), dPat2, rdPat2), dPat3, rdPat3), dPat4, rdPat4).Split(',')
            select new XElement("item",
                new XElement("column1", columns[0]),
                new XElement("Column2", columns[1]),
                new XElement("Column3", new XCData(columns[2].Replace("–", "-").Replace("•", "•").Replace("®", "®").Replace("©", "©"))),
                new XElement("Column4", new XCData(columns[3].Replace("–", "-").Replace("•", "•").Replace("®", "®").Replace("©", "©"))),
                new XElement("Column5", new XCData(columns[4].Replace("–", "-").Replace("x0095", "• ").Replace("®", "®").Replace("©", "©").Replace("nn", "").Replace(""", ""))),
                new XElement("column6", columns[5]),
                new XElement("column7", columns[6].Replace("/", "-")),
                new XElement("column8", columns[7]),
                new XElement("column 9", columns[8].Replace("$", "").Replace(" ", "").Replace(".00", "")),
                new XElement("column10", columns[9]),
                new XElement("column11", columns[10].Replace("/", "-")),
                new XElement("column12", columns[11].Replace("/", "-")),
                new XElement("column13", columns[12].ToLower().Replace("yes", "1").Replace("no", "0")),
                new XElement("column14", columns[13].ToLower().Replace("yes", "1").Replace("no", "0")),
                new XElement("column15", columns[14].ToLower().Replace("yes", "1").Replace("no", "0")),
                new XElement("column16", columns[15].ToLower().Replace("yes", "1").Replace("no", "0")),
                new XElement("column17", columns[16].ToLower().Replace("yes", "1").Replace("�", "0")),
                new XElement("column18", columns[17]),
                new XElement("column19", columns[18]),
                new XElement("column20", columns[19])));
        jobs.Save(@"outputPathFor.xml");

除了未替换的未识别字符外,创建的XML是预期的。我确实尝试使用十六进制,但也没有替换它们。

谢谢!

您可能需要确保从输入中逃脱Unicode字符的更通用方法(而不是进行string.Replace调用)。就像下面的方法:

public static IEnumerable<string> UnicodeXmlEscape(IEnumerable<string> input)
{
    var sb = new StringBuilder();
    foreach (var line in input)
    {
        // Loop through each character in the line to see if it
        // needs escaping.
        for (int i = 0; i < line.Length; i++)
        {
            if (char.IsSurrogatePair(line, i))
                // Escape in "&#xABC1234E" format
                sb.AppendFormat(@"&#x{0:x8}", char.ConvertToUtf32(line, i++)); // i++ to skip next one.
            else
            {
                int ci = char.ConvertToUtf32(line, i);
                if (ci > 127) 
                    // Escape in "&#xAB12" format
                    sb.AppendFormat(@"&#x{0:x4}", ci);
                else // regular ASCII
                    sb.Append(line[i]);
            }
        }
        yield return sb.ToString();
        sb.Clear();
    }
}

所以:

var escaped = UnicodeXmlEscape(new [] { 
    @"I'm trying to replace • along with other characters that are not being" 
});
foreach (var line in escaped)
    Console.WriteLine(line);

将产生下面的输出:

I'm trying to replace &#x2022 along with other characters that are not being

请注意,某些Unicode字符在XML(http://www.w3.org/tr/tr/unicode-xml/)中不合法。上面的代码未检查其发生。

如何在代码中使用它

在您的代码中,您可以简单地使用它,以处理从输入文件中读取的每一行,并" XML Unicode Escape"。

var csvfile = UnicodeXmlEscape(File.ReadLines(inputFile).Skip(1)).ToArray();

要获得适当的逃逸线,您可以将其用作列分配的输入。

,无需再做任何String.Replace

最新更新