我正在使用ETL,我将所有文件名存储在像这样的上下文变量中
context.variablename = context.variablename+input_column
此变量的输出如下:
context.variablename = 01-01-2015.csv.good, 01-02-2015.csv.bad, 01-03-2015.csv.good, 01-04-2015.csv.bad
在input_column中我有像这样的文件列表
01-01-2015.csv.good
01-02-2015.csv.bad
01-03-2015.csv.good
01-04-2015.csv.bad
我想根据扩展名将文件名拆分为两个变量。
因此,context.goodfilevariable
将仅存储这些文件:
01-03-2015.csv.good
01-01-2015.csv.good
虽然context.badfilevariable
只会存储这些文件:
01-02-2015.csv.bad
01-04-2015.csv.bad
如何使用Java实现这一目标?
答案 0 :(得分:0)
比String
更有用的数据结构用于存储多个Object
s(在您的情况下为String
)是ArrayList
。这些可以存储任意数量的相同类的单独Object
,堆栈内存提供。您可以写下以下内容:
// Reading the input
BufferedReader reader = ... // And initialize the reader
ArrayList<String> input = new ArrayList<>();
while (reader.hasNextLine())
input.add(reader.readLine());
// Storing the input
ArrayList<String> good = new ArrayList();
ArrayList<String> bad = new ArrayList();
for (String s : input) {
sections = s.split(".");
if (sections[sections.length - 1].equals("good"))
good.add(s);
else if (sections[sections.length - 1].equals("bad"))
bad.add(s);
else
throw new IOException("Invalid filename.");
}
// Do whatever you want with the good and bad ArrayLists after this.
// If you want arrays, you can use ArrayList's toArray() method.
有些注意事项:
ArrayList
初始化String
,并将类名放在菱形运算符<
和>
中。new ArrayList<>()
中的第二个空白钻石是由于类型推断。此功能仅适用于Java 8,因此如果您使用的是旧版本,则需要将类名放在运算符中。for (String s : input)
与标准for
循环不同。这称为增强的for循环,它迭代实现Iterable的数组或类的所有项。String.split(String)
方法通过给定的分隔符拆分String
(由名称显示)。