【问题标题】:Java: How to join 3 linear arrays in one CSV file with 3 columnsJava:如何在一个包含 3 列的 CSV 文件中加入 3 个线性数组
【发布时间】:2018-10-04 14:30:45
【问题描述】:

我正在使用 puppeteer 抓取网页内容。我设法将我想要的内容刮成三个独立的数组,每个数组具有相同数量的元素。我需要的是加入三个线性阵列,使每个线性阵列成为不同的列。

我把三个数组放在一个对象里,日志输出如下:

    { header1: 
       [ ' string1 ',
         ' string2 ',
         ' string3 '],

      header2: 
       [ ' string4 ',
         ' string5 ',
         ' string6 '], 

      header3: 
       [ ' string7 ',
         ' string8 ',
         ' string9 ']  
     }

JSON.stringify 会将其更改为:

'{"header1":[" string1 "," string2 "," string3 "],"header2":["string4","string5","string6"],"header3":["string7","string8","string9"]}'

我需要的是这样的 CSV 文件:

header1,header2,header3
string1,string4,string7
string2,string5,string8
string3,string6,string9

我确信这非常简单,但我显然是个初学者。我发现的大多数信息都涉及将数组相互连接或使用适当的表语法解析 JSON 对象,这与我在这里所拥有的不太相符。谢谢。

【问题讨论】:

  • 你可以把它放在map中:每个标题都是key,每个value代表3 elements array。之后,您可以将键写为第一行,然后编写值(一次为每个键)
  • @jschnasse 你是对的。完成。

标签: java arrays csv


【解决方案1】:

我需要的是加入三个线性阵列,使每个线性阵列成为不同的列。

第 1 步

定义完成工作的方法,例如

public String arraysToString(String[] first, String[]... arrays) {
    return "Not implemented yet!";
}

该方法将采用可变数量的String[] 数组。

第 2 步

定义一些代码来测试方法,例如

@Test // No clue what this is? Google it - "junit", "tdd", "assertions" ...!
public void testArraysToString() {
    String[] h1 = { "header1", "string1", "string2", "string3" };
    String[] h2 = { "header2", "string4", "string5", "string6" };
    String[] h3 = { "header3", "string7", "string8", "string9" };
    String result = arraysToString(h1, h2, h3);
    String expected = "header1,header2,header3\nstring1,string4,string7\nstring2,string5,string8\nstring3,string6,string9\n";
    org.junit.Assert.assertEquals(expected, result);
    System.out.println(result);
}

第 3 步

尝试编写一些代码,直到您的第一个测试用例成功,例如

public String arraysToString(String[] first, String[]... arrays) {
    for (String[] cur : arrays) {
        if (cur.length != first.length) {
            throw new IllegalArgumentException("Precondition failed. Arrays do not have the same length.");
        }
    }
    StringBuilder strb = new StringBuilder();
    for (int i = 0; i < first.length; i++) {
        strb.append(first[i]);
        for (String[] array : arrays) {
            strb.append(",");
            strb.append(array[i]);
        }
        strb.append("\n");
    }
    return strb.toString();
}

这将打印出来

header1,header2,header3
string1,string4,string7
string2,string5,string8
string3,string6,string9

注意:如果您的实现与预期不符,您现在可以在 stackoverflow.com 上发布问题。只需将您的测试代码和代码连同堆栈跟踪和简短描述一起粘贴即可。

第 4 步

添加更多测试用例并增强实现

【讨论】:

    【解决方案2】:

    我找到了办法。首先,我从 3 个数组构建了一个 JSON 对象:

    for(var JSONobj = [], i = 0; i < array1.length; ++i) 
        JSONobj.push({ array1: array1[i], array2: array2[i], array3: array3[i]})
    

    然后我使用了一些我发现的代码将其转换为 CSV 并导出。我需要 json2csv 和 fs 库。

    const Json2csvParser = require('json2csv').Parser;
    const fields = ['array1', 'array2', 'array3'];
    
    
    const json2csvParser = new Json2csvParser({ fields });
    const csv = json2csvParser.parse(JSONobj);
    
    console.log(csv);
    
    var fs = require('fs');
    
    fs.writeFile('name.csv', csv, 'utf8', function(err) {
      if (err) {
        console.log('Some error occured - file either not saved or corrupted file saved.');
      } else {
        console.log('It\'s saved!');
      }
    });
    

    【讨论】:

    • 你想用const 实现什么?见:docs.oracle.com/javase/specs/jls/se8/html/jls-3.html#jls-3.9。总之,你的代码不是很容易解释,因此很难帮助其他人。你真的应该添加一些关于你正在使用的库的信息,等等。
    • 对不起,我是一个绝对的初学者。我需要的是获取三个单独的数组并构建一个 CSV 表,其中每个数组是一列。所以我基本上将 3 个单独的一维数组(“array1”、“array2”、“array3”)合并为一个对象数组 JSON 对象(“JSONobj”)。然后我将其转换为 CSV 文件并导出。 json2csv 是一个将任何 JSON 对象转换为 CSV 格式的库。 fs lib 用于编写 CSV 文件。
    猜你喜欢
    • 2011-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多