【问题标题】:CSV to XML in PowershellPowershell 中的 CSV 到 XML
【发布时间】:2012-05-09 08:59:15
【问题描述】:

我在将 CSV 文件写入 XML 时遇到问题。

CSV 文件

[Folder];;;;;
[Folder\Subfolder1];;;;;
[Folder\Subfolder1\Subfolder2];;;;;
"Descriptive stuff";"its a password";"user or something";"a URL";"if anyone has a comment"
[Folder\Subfolder1\Subfolder3];;;;;
"Descriptive stuff";"its a password";"user or something";"a URL";"if anyone has a comment"

XML 输出

    <?xml version="1.0" encoding="utf-8"?>
<PASSWORDFILE xmlns="http://www.password-depot.de/schemas/passwordfile/6.0/passwordfile.xsd">
    <PASSWORDS>
        <GROUP NAME="Folder">
            <GROUP NAME="Subfolder1">
                <GROUP NAME="Subfolder2">
                    <ITEM>
                        <DESCRIPTION>Descriptive stuff</DESCRIPTION>
                        <PASSWORD>its a password</PASSWORD>
                        <USERNAME>user or something</USERNAME>
                        <URL>a URL</URL>
                        <COMMENT>if anyone has a comment</COMMENT>
                    </ITEM>
                </GROUP>
                <GROUP NAME="Subfolder3">
                    <ITEM>
                        <DESCRIPTION>Descriptive stuff</DESCRIPTION>
                        <PASSWORD>its a password</PASSWORD>
                        <USERNAME>user or something</USERNAME>
                        <URL>a URL</URL>
                        <COMMENT>if anyone has a comment</COMMENT>
                    </ITEM>
                </GROUP>
            </GROUP>
        </GROUP>
    </PASSWORDS>
</PASSWORDFILE>

我的问题只是,我不知道在使用后如何关闭 GROUP 标签。 目前,我只是关闭了 XML 末尾的 GROUP 标记,从而制作了一棵巨大的树。

【问题讨论】:

  • 现在是。顺便提一句。 CSV 导入在 powershell 中效果很好,所以我猜它是一个 CSV
  • 嗯,无论哪种情况,我都不会将其视为 CSV。根据定义,CSV 只是一个平面记录列表,每个记录都有相同的列(属性)。您所拥有的实际上是对层次结构的描述,因此您需要某种解析器。这可能在半屏代码左右是可能的,但我现在无法真正考虑它。可能维护一堆文件夹及其当前子文件夹,并检查新组需要属于的位置,从堆栈中弹出时关闭 GROUP 元素。不过,它绝对不是单行的。
  • 这很明显,我现在有大约 100 行错误代码。但我被困在如何制作层次结构上。我从 CSV 更改为 XML 是有原因的,因为正如您所说,它没有堆叠
  • 嗯,它不应该需要 100 行。我想更多的是30左右。稍后我会尝试考虑一些事情。不过,现在是工作电话。

标签: xml powershell csv


【解决方案1】:

首先,您的文本不是 CSV,但是如果您使用这种格式固定,您肯定可以通过编写自定义 DLL 来转换为 XML。您只需要了解 CSV 文件的详细信息,然后使用 XElement/XAttribute 创建 XML。

我只是使用下面的代码转换成一个DLL,然后保存为XML(注意XML创建代码是绑定在下面链接中提供的CSV文件:

http://msdn.microsoft.com/en-us/library/bb387090.aspx

这是我的自定义 DLL 代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Xml.Linq;

namespace CSVtoXML
{
public class Actions
 {
    public Actions()
    {

    }

    public static void convertCSVtoXML(string csvPath)
    {

        string[] source = File.ReadAllLines(csvPath);
        XElement cust = new XElement("Root",
            from str in source
            let fields = str.Split(',')
            select new XElement("Customer",
                new XAttribute("CustomerID", fields[0]),
                new XElement("CompanyName", fields[1]),
                new XElement("ContactName", fields[2]),
                new XElement("ContactTitle", fields[3]),
                new XElement("Phone", fields[4]),
                new XElement("FullAddress",
                    new XElement("Address", fields[5]),
                    new XElement("City", fields[6]),
                    new XElement("Region", fields[7]),
                    new XElement("PostalCode", fields[8]),
                    new XElement("Country", fields[9])
                )
            )
        ); 
        cust.Save("result.xml");
    }
 }
}

这是我在 powershell 中使用这个 DLL 的方式:

  • PS> [Reflection.Assembly]::LoadFile(“CSVtoXML.dll”)
  • PS> [CSVtoXML.Actions]::convertCSVtoXML("data.csv")

这将生成“Result.xml”

【讨论】:

    猜你喜欢
    • 2019-03-28
    • 2021-10-23
    • 2018-07-30
    • 2020-06-10
    • 2017-09-09
    • 1970-01-01
    • 2016-03-29
    • 1970-01-01
    • 2020-07-03
    相关资源
    最近更新 更多