有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!


共 (6) 个答案

  1. # 1 楼答案

    我知道您要求使用Java,但我觉得这是一项非常适合脚本语言的任务。下面是一个用Groovy编写的快速(非常简单)解决方案

    测试。csv

    string,float1,float2,integer
    hello world,1.0,3.3,4
    goodbye world,1e9,-3.3,45
    hello again,-1,23.33,456
    hello world 3,1.40,34.83,4999
    hello 2 world,9981.05,43.33,444
    

    csvtoxml。groovy

    #!/usr/bin/env groovy
    
    def csvdata = []
    new File("test.csv").eachLine { line ->
        csvdata << line.split(',')
    }
    
    def headers = csvdata[0]
    def dataRows = csvdata[1..-1]
    
    def xml = new groovy.xml.MarkupBuilder()
    
    // write 'root' element
    xml.root {
        dataRows.eachWithIndex { dataRow, index ->
            // write 'entry' element with 'id' attribute
            entry(id:index+1) {
                headers.eachWithIndex { heading, i ->
                    // write each heading with associated content
                    "${heading}"(dataRow[i])
                }
            }
        }
    }
    

    将以下XML写入标准输出:

    <root>
      <entry id='1'>
        <string>hello world</string>
        <float1>1.0</float1>
        <float2>3.3</float2>
        <integer>4</integer>
      </entry>
      <entry id='2'>
        <string>goodbye world</string>
        <float1>1e9</float1>
        <float2>-3.3</float2>
        <integer>45</integer>
      </entry>
      <entry id='3'>
        <string>hello again</string>
        <float1>-1</float1>
        <float2>23.33</float2>
        <integer>456</integer>
      </entry>
      <entry id='4'>
        <string>hello world 3</string>
        <float1>1.40</float1>
        <float2>34.83</float2>
        <integer>4999</integer>
      </entry>
      <entry id='5'>
        <string>hello 2 world</string>
        <float1>9981.05</float1>
        <float2>43.33</float2>
        <integer>444</integer>
      </entry>
    </root>
    

    但是,代码进行非常简单的解析(不考虑引号或转义逗号),并且不考虑可能缺少的数据

  2. # 2 楼答案

    也许这会有帮助:JSefa

    您可以使用此工具读取CSV文件并将其序列化为XML

  3. # 3 楼答案

    如上所述,我不知道如何一步到位,但如果您准备好使用非常简单的外部库,我建议:

    OpenCsv用于解析CSV(小、简单、可靠且易于使用)

    Xstream解析/序列化XML(非常易于使用,并创建完全可读的XML)

    使用与上述相同的示例数据,代码如下所示:

    package fr.megiste.test;
    
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.util.ArrayList;
    import java.util.List;
    
    import au.com.bytecode.opencsv.CSVReader;
    
    import com.thoughtworks.xstream.XStream;
    
    public class CsvToXml {     
    
        public static void main(String[] args) {
    
            String startFile = "./startData.csv";
            String outFile = "./outData.xml";
    
            try {
                CSVReader reader = new CSVReader(new FileReader(startFile));
                String[] line = null;
    
                String[] header = reader.readNext();
    
                List out = new ArrayList();
    
                while((line = reader.readNext())!=null){
                    List<String[]> item = new ArrayList<String[]>();
                        for (int i = 0; i < header.length; i++) {
                        String[] keyVal = new String[2];
                        String string = header[i];
                        String val = line[i];
                        keyVal[0] = string;
                        keyVal[1] = val;
                        item.add(keyVal);
                    }
                    out.add(item);
                }
    
                XStream xstream = new XStream();
    
                xstream.toXML(out, new FileWriter(outFile,false));
    
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    

    产生以下结果: (Xstream允许对结果进行非常精细的调整…)

    <list>
      <list>
        <string-array>
          <string>string</string>
          <string>hello world</string>
        </string-array>
        <string-array>
          <string>float1</string>
          <string>1.0</string>
        </string-array>
        <string-array>
          <string>float2</string>
          <string>3.3</string>
        </string-array>
        <string-array>
          <string>integer</string>
          <string>4</string>
        </string-array>
      </list>
      <list>
        <string-array>
          <string>string</string>
          <string>goodbye world</string>
        </string-array>
        <string-array>
          <string>float1</string>
          <string>1e9</string>
        </string-array>
        <string-array>
          <string>float2</string>
          <string>-3.3</string>
        </string-array>
        <string-array>
          <string>integer</string>
          <string>45</string>
        </string-array>
      </list>
      <list>
        <string-array>
          <string>string</string>
          <string>hello again</string>
        </string-array>
        <string-array>
          <string>float1</string>
          <string>-1</string>
        </string-array>
        <string-array>
          <string>float2</string>
          <string>23.33</string>
        </string-array>
        <string-array>
          <string>integer</string>
          <string>456</string>
        </string-array>
      </list>
      <list>
        <string-array>
          <string>string</string>
          <string>hello world 3</string>
        </string-array>
        <string-array>
          <string>float1</string>
          <string>1.40</string>
        </string-array>
        <string-array>
          <string>float2</string>
          <string>34.83</string>
        </string-array>
        <string-array>
          <string>integer</string>
          <string>4999</string>
        </string-array>
      </list>
      <list>
        <string-array>
          <string>string</string>
          <string>hello 2 world</string>
        </string-array>
        <string-array>
          <string>float1</string>
          <string>9981.05</string>
        </string-array>
        <string-array>
          <string>float2</string>
          <string>43.33</string>
        </string-array>
        <string-array>
          <string>integer</string>
          <string>444</string>
        </string-array>
      </list>
    </list>
    
  4. # 4 楼答案

    这个解决方案不需要任何CSV或XML库,而且我知道,它不会处理任何非法字符和编码问题,但是如果您的CSV输入不违反上述规则,您可能也会对它感兴趣

    注意:除非您知道自己在做什么或没有机会使用其他库(可能在某些官僚项目中),否则不应使用此代码。。。对较旧的运行时环境使用StringBuffer

    现在我们开始:

    BufferedReader reader = new BufferedReader(new InputStreamReader(
            Csv2Xml.class.getResourceAsStream("test.csv")));
    StringBuilder xml = new StringBuilder();
    String lineBreak = System.getProperty("line.separator");
    String line = null;
    List<String> headers = new ArrayList<String>();
    boolean isHeader = true;
    int count = 0;
    int entryCount = 1;
    xml.append("<root>");
    xml.append(lineBreak);
    while ((line = reader.readLine()) != null) {
        StringTokenizer tokenizer = new StringTokenizer(line, ",");
        if (isHeader) {
            isHeader = false;
            while (tokenizer.hasMoreTokens()) {
                headers.add(tokenizer.nextToken());
            }
        } else {
            count = 0;
            xml.append("\t<entry id=\"");
            xml.append(entryCount);
            xml.append("\">");
            xml.append(lineBreak);
            while (tokenizer.hasMoreTokens()) {
                xml.append("\t\t<");
                xml.append(headers.get(count));
                xml.append(">");
                xml.append(tokenizer.nextToken());
                xml.append("</");
                xml.append(headers.get(count));
                xml.append(">");
                xml.append(lineBreak);
                count++;
            }
            xml.append("\t</entry>");
            xml.append(lineBreak);
            entryCount++;
        }
    }
    xml.append("</root>");
    System.out.println(xml.toString());
    

    输入测试。csv(从本页的另一个答案中盗取):

    string,float1,float2,integer
    hello world,1.0,3.3,4
    goodbye world,1e9,-3.3,45
    hello again,-1,23.33,456
    hello world 3,1.40,34.83,4999
    hello 2 world,9981.05,43.33,444
    

    结果输出:

    <root>
        <entry id="1">
            <string>hello world</string>
            <float1>1.0</float1>
            <float2>3.3</float2>
            <integer>4</integer>
        </entry>
        <entry id="2">
            <string>goodbye world</string>
            <float1>1e9</float1>
            <float2>-3.3</float2>
            <integer>45</integer>
        </entry>
        <entry id="3">
            <string>hello again</string>
            <float1>-1</float1>
            <float2>23.33</float2>
            <integer>456</integer>
        </entry>
        <entry id="4">
            <string>hello world 3</string>
            <float1>1.40</float1>
            <float2>34.83</float2>
            <integer>4999</integer>
        </entry>
        <entry id="5">
            <string>hello 2 world</string>
            <float1>9981.05</float1>
            <float2>43.33</float2>
            <integer>444</integer>
        </entry>
    </root>
    
  5. # 5 楼答案

    我不明白你为什么要这么做。这听起来几乎像是货物崇拜编码

    将CSV文件转换为XML不会增加任何价值。您的程序已经在读取CSV文件,因此认为您需要XML是行不通的

    另一方面,读取CSV文件,对值执行操作,然后序列化为XML是有意义的(当然,使用XML也是有意义的…;)但您应该已经有了一种序列化为XML的方法

  6. # 6 楼答案

    我有一个开源框架,用于处理CSV和平面文件。也许值得一看:JFileHelpers

    使用该工具包,您可以使用bean编写代码,如:

    @FixedLengthRecord()
    public class Customer {
        @FieldFixedLength(4)
        public Integer custId;
    
        @FieldAlign(alignMode=AlignMode.Right)
        @FieldFixedLength(20)
        public String name;
    
        @FieldFixedLength(3)
        public Integer rating;
    
        @FieldTrim(trimMode=TrimMode.Right)
        @FieldFixedLength(10)
        @FieldConverter(converter = ConverterKind.Date, 
        format = "dd-MM-yyyy")
        public Date addedDate;
    
        @FieldFixedLength(3)
        @FieldOptional
        public String stockSimbol;  
    }
    

    然后使用以下方法解析文本文件:

    FileHelperEngine<Customer> engine = 
        new FileHelperEngine<Customer>(Customer.class); 
    List<Customer> customers = 
        new ArrayList<Customer>();
    
    customers = engine.readResource(
        "/samples/customers-fixed.txt");
    

    您将拥有一个已解析对象的集合

    希望有帮助