如何用批处理提取一目录下所有文本文件中的特定字符并同文件名一起输出?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用批处理提取一目录下所有文本文件中的特定字符并同文件名一起输出?相关的知识,希望对你有一定的参考价值。
现有一批txt文件,文件名无规律,随便打开一个a.txt,看到某段中间写着name="KEYWORDS" content="APPLE,SHOP,ENG," 前后都有其他各种内容,我需要通过批处理提取出APPLE、SHOP和ENG以及文件名输出至另一文件1.txt中,如此往复,最后1.txt记录下a.txt的关键词为APPLE,SHOP,ENG,b.txt的关键词为……
参考技术A 需要文件内容结构 参考技术B @echo off&setlocal enabledelayedexpansion(
for /f "" %%i in ('dir /b /a-d *.txt') do (
(
set "fn=%%i"
for /f "tokens=3 delims==" %%m in ('findstr /i /c:"APPLE,SHOP,ENG," "!fn!"') do (
set /p=%%~m<nul
)
set /p=……!fn!<nul
echo\
)>>$
)
) 2>nul
move /y $ 1.txt >nul
echo sucessfully!&echo=&pause>nul
放在txt文本同一目录下运行即可。。
PS:文件名不能含有空格或tab制表符! 并且要提取的行有且只有name="KEYWORDS" content="APPLE,SHOP,ENG,"追问
N多txt文件 每个文件的关键词是不一样的 内容和数量也不定,只知道它们是在name="KEYWORDS" content=之后
追答是否文本中只有一行name="KEYWORDS" content=或者一行中只有一个name="KEYWORDS" content=??是否关键词在content=后面的双引号里面??是否关键词包含特殊字符如?|||&等??你说不出一两条规律来很难帮不上你。。。。。
本回答被提问者采纳如何用不同的字符替换字符串中的特定字符?
【中文标题】如何用不同的字符替换字符串中的特定字符?【英文标题】:How to replace specific characters in a String with different ones? 【发布时间】:2019-02-01 08:43:19 【问题描述】:给定一个
String text = "RHKKA";
如何有效地将所有'R'替换为'H',所有'H'替换为'E',所有 'K' 和 'L' 以及所有 'A' 和 'O'?
字符串文本将是HELLO
。
【问题讨论】:
你有整个字母表的映射,还是只有那些字母? 【参考方案1】:您可以创建一个字符映射作为键和值,然后像这样逐个字符循环:
String text = "RHKKA";
Map<Character, Character> map = new HashMap<>();
map.put('R', 'H');
map.put('H', 'E');
map.put('K', 'L');
map.put('A', 'O');
char[] chars = text.toCharArray();
for (int i = 0; i < chars.length; i++)
chars[i] = map.get(chars[i]);
String result = String.valueOf(chars);
System.out.println(result.toString());//HELLO
Java8+ 可能的解决方案
或者如果你使用的是 Java8+,你可以使用:
String result = text.chars()
.mapToObj(c -> String.valueOf(map.get((char) c)))
.collect(Collectors.joining());//HELLO
Java9+ 可能的解决方案
如果像这样使用Matcher::replaceAll,另一种可能的解决方案:
String text = "RHKKA";
Map<Character, Character> map = Map.of('R', 'H', 'H', 'E', 'K', 'L', 'A', 'O');
text = Pattern.compile(".").matcher(text)
.replaceAll(c -> String.valueOf(map.get(c.group().charAt(0))));//HELLO
你可以阅读更多关于Map.of
【讨论】:
当然,你需要确保映射是完整的(足够),否则你的输出字符串会充满null
s。
另外也许值得指出的是,您不需要第一种方式的StringBuilder
,您可以从toCharArray()
更新char[]
,然后从中构建一个新字符串。 (或者用整个文本构造 StringBuilder,一次更新一个字符。有点相同的方法。)
@YCF_L 是的。对于第二部分,我的意思是你可以对 StringBuilder result = new StringBuilder(text)
和 charAt/set 做同样的事情,因为 StringBuilder
只是 char[]
的包装。
谢谢@AndyTurner 好主意,我用这个编辑我的答案
我希望我可以为 Java9 Map.of() 投票两次 ;-)【参考方案2】:
这是基于字符替换的另一种方法:
String text = "RHKKA";
String before = "RHKA"; // before mapping
String after = "HELO"; // after mapping
String output = Arrays.stream(text.split("")) // Split by characters
.map(i -> String.valueOf(after.charAt(before.indexOf(i)))) // Replace each letter
.collect(Collectors.joining("")); // Collect to String
System.out.println(output); // HELLO
顺便说一句,我确定您打算将 A
替换为 O
.. 而不是您在描述中的 E
。
【讨论】:
【参考方案3】:我认为最好的办法是创建一个新的String
或StringBuilder
,用正确的字符替换原始字符中的所有字符。
比如:
String text = "RHKKA";
StringBuilder newString = new StringBuilder(text.length());
for (int i = 0; i < text.length(); i++)
char newChar = text.charAt(i);
if (text.charAt(i) == 'R')
newChar = 'H';
else if (text.charAt(i) == 'H')
newChar = 'E';
else if (text.charAt(i) == 'K')
newChar = 'L';
else if (text.charAt(i) == 'A')
newChar = 'O';
newString.append(newChar);
System.out.println(newString); //prints HELLO
【讨论】:
【参考方案4】:标准 Java 中没有这样的功能,但您可以查看 Apache Commons StringUtils.replaceChars,它一次性将组替换为另一个组,有效地执行与 Unix tr 命令相同的操作:
StringUtils.replaceChars("RHKKA", "RHKA", "HELE") = "HELLO".
【讨论】:
以上是关于如何用批处理提取一目录下所有文本文件中的特定字符并同文件名一起输出?的主要内容,如果未能解决你的问题,请参考以下文章