我试图读取一个巨大的文件,提取“引号”中的文本,将行放入一个集合,并使用Java8stream
将集合的内容写入一个文件。
public class DataMiner {
private static final Pattern quoteRegex = Pattern.compile("\"([^\"]*)\"");
public static void main(String[] args) {
String fileName = "c://exec.log";
try (Stream<String> stream = Files.lines(Paths.get(fileName))) {
Set<String> dataSet = stream.
//How do I Perform pattern match here
.collect(Collectors.toSet());
Files.write(Paths.get(fileName), dataSet);
} catch (IOException e) {
e.printStackTrace();
}
}
}
不幸的是,Java正则表达式类不为匹配的结果提供流,只提供splitasstream()
方法,但您不需要split。
注意:它已经作为matcher.results()添加到Java9中。
但是,您可以自己为它创建一个通用帮助器类:
public final class PatternStreamer {
private final Pattern pattern;
public PatternStreamer(String regex) {
this.pattern = Pattern.compile(regex);
}
public Stream<MatchResult> results(CharSequence input) {
List<MatchResult> list = new ArrayList<>();
for (Matcher m = this.pattern.matcher(input); m.find(); )
list.add(m.toMatchResult());
return list.stream();
}
}
然后,通过使用FlatMap()
,您的代码变得简单起来:
private static final PatternStreamer quoteRegex = new PatternStreamer("\"([^\"]*)\"");
public static void main(String[] args) throws Exception {
String inFileName = "c:\\exec.log";
String outFileName = "c:\\exec_quoted.txt";
try (Stream<String> stream = Files.lines(Paths.get(inFileName))) {
Set<String> dataSet = stream.flatMap(quoteRegex::results)
.map(r -> r.group(1))
.collect(Collectors.toSet());
Files.write(Paths.get(outFileName), dataSet);
}
}
由于每次只处理一行,所以临时列表
就可以了。如果输入字符串很长,并且有很多匹配项,那么拆分器
将是更好的选择。参见如何创建regex匹配流?
问题内容: 我正在尝试读取一个大文件,并将“引号”中的文本提取出来,并将这些行放入集合中,然后使用Java 8将集合的内容写入文件中。 请帮我。谢谢! 编辑:问题的答案。 不,没有多引号的文字。 我本可以使用简单的循环。但是我想使用Java 8流 问题答案: 不幸的是,Java正则表达式类不提供匹配结果的流,仅提供一种方法,但您不想拆分。 注意:它已 在Java 9中 作为Matcher.resu
我已经实现了使用regex从字符串中提取一些值的逻辑,如下所示。 它按预期工作。我现在必须使用java流实现此逻辑,以使其更具可读性。我只是想让它更具可读性,更容易看到。我已经实现了使用这个,但它没有工作任何建议。 我得到的错误是没有找到匹配。但是有没有办法给下一个流提供matcher呢
我正在使用下面的代码片段来保存数据。它只会在同一分区文件夹下创建一个新的拼花地板文件。是否有任何方法可以将数据真正附加到现有的拼花地板文件中。所以,如果一天中有许多附件,我们就不会有多个文件? <代码>测向。聚结(1)。写模式(“追加”)。partitionBy(“paritionKey”)。拼花地板(“…\parquet\u file\u folder\”) 非常感谢你的帮助。
类似定位器参数,文本模式是另一种常用的 Selenium 命令参数。需要使用文本模式的命令,例如:verifyTextPresent, verifyTitle, verifyAlert, assertConfirmation, verifyText, verifyPrompt。上面已经提到,LinkText 定位器可使用文本模式。文本模式使用特殊字符来模糊匹配预期的文本,而不必准确的描述该文本。
一、模式匹配 Scala 支持模式匹配机制,可以代替 swith 语句、执行类型检查、以及支持析构表达式等。 1.1 更好的swith Scala 不支持 swith,可以使用模式匹配 match...case 语法代替。但是 match 语句与 Java 中的 switch 有以下三点不同: Scala 中的 case 语句支持任何类型;而 Java 中 case 语句仅支持整型、枚举和字符串常
主机权限和 内容脚本匹配 是基于匹配模式定义的一组 URL。匹配模式本质上是一个以允许的 schema(http,https,file 或ftp 开头)的URL,并且可以包含 “*” 字符。特殊模式 < all_urls > 匹配以允许的 schema 开头的任何 URL。 每个模式包含 3 个部分: schema - 例如,http 或file 或 * 注意:对文件 URL 的访问不是自动的。用