标题: [文本处理] 【已解决】BAT:如何合并前三列特定符号相同的行 [打印本页]
作者: 思想之翼 时间: 2022-11-25 21:36 标题: 【已解决】BAT:如何合并前三列特定符号相同的行
本帖最后由 思想之翼 于 2022-11-25 23:47 编辑
D:\DATA1\内有若干文本,编码为UTF-8,记录的数据格式如下:
A->甲
A->甲2
B->乙
B->乙2
C->丙
C->丙2
D->丁
D->丁2
E->戊
E->戊2
F->己
F->己2
G->庚
G->庚2
H->辛
H->辛2
I->壬
I->壬2
J->癸
J->癸2
甲乙丙丁戊己庚辛壬癸 表示的数字串 长短不一。
欲将数据整理成如下格式,编码UTF-8保持不变,写入D:\DATA2\
A->甲 甲2
B->乙 乙2
C->丙 丙2
D->丁 丁2
E->戊 戊2
F->己 己2
G->庚 庚2
H->辛 辛2
I->壬 壬2
J->癸 癸2
作者: WHY 时间: 2022-11-25 23:25
- <# :
- @echo off
- PowerShell -NoProfile -C ". ([ScriptBlock]::Create((gc -Literal '%~f0') -join \"`r`n\"))"
- pause & exit/b
- #>
-
- $path1 = 'D:\DATA1\'; #源目录
- $path2 = 'D:\DATA2\'; #目标目录
-
- if( -Not [IO.Directory]::Exists($path2) ){ $null = md $path2; }
-
- forEach( $file In (dir -Literal $path1 -Filter *.txt) ){
- $dic = New-Object 'System.Collections.Generic.Dictionary[string, [Collections.ArrayList]]';
- $res = [Collections.ArrayList]@();
-
- forEach( $strLine In [IO.File]::ReadAllLines($file.FullName, [Text.Encoding]::UTF8) ){
- $arr = $strLine -split '->';
- if( $arr.Count -eq 2 ){
- $key = $arr[0].ToLower();
- if( -Not $dic.ContainsKey($key) ){
- $dic.Add( $key, @($strLine) );
- }else{
- [void]$dic[$key].Add( $arr[1] );
- }
- }
- }
-
- forEach( $key In $dic.Keys ){
- [void]$res.Add( $dic[$key] -join ' ' );
- }
-
- [IO.File]::WriteAllLines( $path2 + $file.Name, $res, [Text.Encoding]::UTF8 );
- }
复制代码
作者: hfxiang 时间: 2022-11-26 08:39
本帖最后由 hfxiang 于 2022-11-26 08:50 编辑
将- A->甲
- A->甲2
- B->乙
- B->乙2
- C->丙
- C->丙2
- D->丁
- D->丁2
- E->戊
- E->戊2
- F->己
- F->己2
- G->庚
- G->庚2
- H->辛
- H->辛2
- I->壬
- I->壬2
- J->癸
- J->癸2
复制代码
以ANSI格式保存为1.txt
下载gawk( http://bcn.bathome.net/tool/4.1.0/gawk.exe )
执行- gawk -F"->" "{a[$1]=a[$1]?a[$1]\" \"$2:$2}END{for (id in a)print id FS a[id]}" 1.txt>2.txt
复制代码
结果(2.txt)- A->甲 甲2
- B->乙 乙2
- C->丙 丙2
- D->丁 丁2
- E->戊 戊2
- F->己 己2
- G->庚 庚2
- H->辛 辛2
- I->壬 壬2
- J->癸 癸2
复制代码
补充:
把2.txt另存为UTF-8编码格式即可
或者使用Ruby中提供的GAWK,这个版本支持对UTF-8编码格式文本的操作
作者: terse 时间: 2022-11-26 08:50
这里用group也不错- [IO.File]::ReadAllLines($file.FullName, [Text.Encoding]::UTF8)|
- group { $_.split('->')[0]+'->' }|%{
- $f = $_
- $s = $($f.Group | % { $_.split('->')[-1] }) -join ' '
- $f.Name + $s
- }
复制代码
作者: WHY 时间: 2022-11-26 14:36
本帖最后由 WHY 于 2022-11-26 23:55 编辑
Test.js- var path1 = 'D:\\Data1\\'; //源文件路径
- var path2 = 'D:\\Data2\\'; //目标文件路径
-
- var getText = function(file){
- var ado = new ActiveXObject('Adodb.Stream');
- ado.Type = 2;
- ado.CharSet = 'UTF-8';
- ado.Open();
- ado.LoadFromFile(file);
- var text = ado.ReadText(-1);
- ado.Close();
- return text;
- }
-
- var saveFile = function(file){
- var ado = new ActiveXObject('Adodb.Stream');
- ado.Type = 2;
- ado.CharSet = 'UTF-8';
- ado.Open();
- ado.WriteText(out.join('\r\n'));
- ado.SaveToFile(file, 2);
- ado.Close();
- }
-
- var fso = new ActiveXObject('Scripting.FileSystemObject');
- if( !fso.FolderExists(path2) ) fso.CreateFolder(path2);
-
- var e = new Enumerator( fso.GetFolder(path1).Files );
- var reg = /^((?:(?!->)\S)+)->(\S+)(?=\r\n|$)/mg;
-
- for(; !e.atEnd(); e.moveNext()){
- if( !/\.txt$/i.test(e.item().Name) ) continue;
- var map = {};
- var out = [];
- var str = getText( e.item().Path );
- while( arr = reg.exec(str) ){
- var key = arr[1].toLowerCase();
- map[key] = map.hasOwnProperty(key) ? map[key] + ' ' + arr[2] : arr[0];
- }
- for( var key in map ) out.push(map[key]);
- saveFile( path2 + e.item().Name );
- }
-
- WSH.Echo('Done');
复制代码
作者: WHY 时间: 2022-11-26 14:36
本帖最后由 WHY 于 2022-11-26 14:41 编辑
- @echo off
- md "D:\Data2\" 2>nul
- PowerShell "dir 'D:\Data1\' -Filter *.txt | forEach{(gc $_.FullName -Enc UTF8) -match '->' | group{($_ -split '->')[0]} | forEach{$_.Name + '->' + ($_.Group -replace '^(?:(?!->).)*->' -join ' ')} | sc ('D:\Data2\' + $_.Name) -Enc UTF8}"
- pause
复制代码
作者: 思想之翼 时间: 2023-2-21 15:15
本帖最后由 思想之翼 于 2023-2-21 15:30 编辑
回复 3# hfxiang - gawk -F"->" "{a[$1]=a[$1]?a[$1]\" \"$2:$2}END{for (id in a)print id FS a[id]}" 1.txt>2.txt
复制代码
请教:gawk 合并后,各行如何分别实现删重效果
列如合并后:
A->甲 甲2 甲3 甲2,删重,保留1个甲2
B->乙 乙2 甲3 乙2,删重,保留1个乙2
......
结果:
A->甲 甲2 甲3
A->乙 乙2 乙3
......
作者: hfxiang 时间: 2023-2-21 15:29
回复 7# 思想之翼 - gawk -F"->" "!(($1 $2) in T) {T[$1 $2];a[$1]=a[$1]?a[$1]\" \"$2:$2}END{for (id in a)print id FS a[id]}" 1.txt>3.txt
复制代码
作者: 思想之翼 时间: 2023-2-21 15:36
本帖最后由 思想之翼 于 2023-2-21 15:38 编辑
谢谢您的帮助
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |