【问题标题】:Java: assign String[] array element to a String?Java:将String []数组元素分配给String?
【发布时间】:2010-10-29 09:34:16
【问题描述】:

我对此很陌生,这可能是一个非常明显的答案。在我的 csv 脚本中,我试图弄清楚如何使用 CSVReader 类读取 csv 文件并写入新的 csv 文件。错误告诉我 writeNext(java.lang.String[]) 不能应用于 (java.lang.String)。我尝试使用直接分配和 getString() 方法,但没有任何效果。有任何想法吗?

我有以下代码: 更新

public static void main(String[] args) throws IOException {
    //read csv file
    CSVReader reader = new CSVReader(new FileReader(ADDRESS_FILE));

    //write to csv file 
    CSVWriter writer2 = new CSVWriter(new FileWriter("output.csv"), '\t');

    String [] nextLine;
    while ((nextLine = reader.readNext()) != null) {
        System.out.println("Name: [" + nextLine[0] + "]\nAddress: [" + nextLine[1] + "]\nEmail: [" + nextLine[2] + "]");
        String[] newRow = new String[] {nextLine[0],nextLine[2], nextLine[1]};
    }

    //writer2.writeNext(entries);
    writer2.writeAll(newRow);
    writer2.close();

}

错误: c:\java\examples\ETHImport.java:46: 找不到符号 符号:变量newRow 位置: ETHImport 类 writer2.writeAll(newRow);

1 个错误

提前致谢。

【问题讨论】:

  • 我又累又懒,懒得为你做所有事情:哪里出错了?
  • 在您的新代码中,您只是缺少“新”。它应该是“String [] newRow = new String[] ...”
  • 酷.. 这真的很有帮助.. 不知道为什么我会得到一个在 while 循环中声明的变量
  • 查看我的回答中的评论 - 您需要在循环中使用 writer2.writeNext(newRow)。删除它外面的线。

标签: java arrays string


【解决方案1】:

要轻松地将 String 放入 String[] 使用:

String[] entriesArr = new String[]{ entries };

或快捷方式

String[] entriesArr = { entries };

现在entriesArr 是一个包含一个元素String[]entries

【讨论】:

  • 或者快捷方式,因为这是一个声明:String[] strs = { str };
  • 请注意,该元素应该是一个字符串字面值,所以实际上该行应该是 String[] entriesArr = new String[] {"entries"}。
【解决方案2】:
String[] entries = new String[] { "entry1", "entry2"};

它需要一个条目数组,而不仅仅是一个字符串。如果您遵循此示例 http://opencsv.sourceforge.net/ 请注意

String[] entries = "first#second#third".split("#");

最后的 split 调用产生一个 String[]。

为您的代码:

public static void main(String[] args) throws IOException {
        //read csv file
        CSVReader reader = new CSVReader(new FileReader(ADDRESS_FILE));

        //write to csv file 
        CSVWriter writer2 = new CSVWriter(new FileWriter("output.csv"), '\t');

        String [] nextLine;
        while ((nextLine = reader.readNext()) != null) {
                writer2.writeNext( new String[] {nextLine[0],nextLine[2], nextLine[1]});
        }


        writer2.close();

}

【讨论】:

  • 我正在努力的只是为每个记录集构建一个包含选定列的字符串,以便我可以将其写入新文件
  • 您不应该构建字符串。您应该使用选定的列构建一个字符串 array
  • 太棒了!我不知道我可以在方法中声明一些东西。谢谢!
【解决方案3】:

您需要一个字符串数组,而不是单个字符串。您真的确定要将所有值提取到一个字符串中吗?我希望writeNext 根据你给它的字符串值写一行,it 放入逗号等。毕竟,这是一个CsvWriter - 它应该做逗号分隔。

在我看来,您已经在使用的 writeAll 方法可以实现您想要的效果,而 writeNext 只会写一行……您想实现什么 writeAll 没有?不为你做吗?为什么你需要逐行阅读并首先构造entries?你不能打电话吗:

writer2.writeAll(allElements);

我的猜测是,考虑到writer2 的构造方式,这将编写一个制表符 分隔的文件。

编辑:鉴于 cmets 中的其他信息,我怀疑您想要:

  • 打开CsvReader
  • 打开CsvWriter(使用适当的Writer; 作为构造函数参数)
  • 循环读取一行作为字符串数组(使用CsvReader.readNext()),为输出创建一个新字符串数组,然后调用CsvWriter.writeNext() 将该字符串数组写入文件。
  • 在 finally 块中关闭 CsvReaderCsvWriter(这样如果出现任何问题,它们仍然会被关闭)

从现有的字符串数组构建新的字符串数组将类似于(按照您的示例):

String[] newRow = new String[] { oldRow[0], oldRow[2], oldRow[1] };

这基本上只保留前三列,在第二和第三列之间切换。如果您需要其他列,只需以相同的方式更改即可。

请注意,我不会建议使用 FileWriter 写入文件 - 使用 FileOutputStream 和链接到它的 OutputStreamWriter,因为这样您可以设置字符编码使用平台默认的。

【讨论】:

  • 我很确定你是对的。 CsvWriter 的 Javadoc 符合您的期望,但我从未使用过。
  • 目标是在 csv 文件中提取选定数量的列,对其中一些列进行操作/格式化,然后将它们插入到带有逗号的输出文件中,并使用分号作为行终止符。 writeall 只是将所有内容都转储出去,而不仅仅是输出我需要的列
  • 我用建议的更改对其进行了更新,但是我现在导致了不同的错误。它说'.class'是预期的,并且有一个指向nextLine的胡萝卜..在while循环中声明这样的字符串是否正确的语法?
  • 我不知道你为什么会遇到这样的错误,但你正在尝试使用 newRow outside 循环。你应该打电话给 writer2.writeNext(newRow); 内部循环。
【解决方案4】:

writer.writeNext(String[]) 正在寻找一个数组,然后将其写为“[0],[1],[2]”

由于您将整个 csv 文件存储为一个字符串,因此您需要拆分该字符串备份。实际上,您不应该将每个项目组合成一个字符串,而是将其存储为代表 csv 文件中每一行的字符串数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-22
    • 2020-11-30
    • 1970-01-01
    • 1970-01-01
    • 2020-11-04
    • 1970-01-01
    • 2021-09-26
    相关资源
    最近更新 更多