找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 20800|回复: 6

[文本处理] 求助批处理怎么分割一行数据?

[复制链接]
发表于 2022-5-22 19:46:05 | 显示全部楼层 |阅读模式
{1., 352400.11}, {9., 348500.91}, {15., 349000.76}, {21., 348800.83}, {29., 330900.75}, {37., 327100.03}, {45., 328300.43}, {49., 321300.33}, {51., 322500.64}, {62., 306700.}, {74., 314600.}
以上一行数据怎么分割成以下模式二个数据啊?谢谢
数据1
1 -> 1, 2 -> 9, 3 -> 15, 4 -> 21, 5 -> 29, 6 -> 37, 7 -> 45, 8 -> 49, 9 -> 51, 10 -> 62, 11 -> 74
数据二
1 -> 352400, 2 -> 348500, 3 -> 349000, 4 -> 348800, 5 -> 330900, 6 -> 327100, 7 -> 328300, 8 -> 321300, 9 -> 322500, 10 -> 306700, 11 -> 314600
发表于 2022-5-22 20:17:41 | 显示全部楼层
抛个砖:
  1. my $raw = '{1., 352400.11}, {9., 348500.91}, {15., 349000.76}, {21., 348800.83}, {29., 330900.75}, {37., 327100.03}, {45., 328300.43}, {49., 321300.33}, {51., 322500.64}, {62., 306700.}, {74., 314600.}';
  2. my @d = eval "($raw)"=~tr/{}/[]/r;
  3. printf "data 1: %s\n", join( ", ", map { sprintf "%d -> %d", $_+1, $d[$_][0] } ( 0 .. $#d) );
  4. printf "data 2: %s\n", join( ", ", map { sprintf "%d -> %d", $_+1, $d[$_][1] } ( 0 .. $#d) );
复制代码
脚本语言: perl

输出
data 1: 1 -> 1, 2 -> 9, 3 -> 15, 4 -> 21, 5 -> 29, 6 -> 37, 7 -> 45, 8 -> 49, 9 -> 51, 10 -> 62, 11 -> 74
data 2: 1 -> 352400, 2 -> 348500, 3 -> 349000, 4 -> 348800, 5 -> 330900, 6 -> 327100, 7 -> 328300, 8 -> 321300, 9 -> 322500, 10 -> 306700, 11 -> 314600
发表于 2022-5-23 10:03:29 | 显示全部楼层
JS脚本
  1. //分割数据.js//操作:拖入数据文本文件
  2. //有多项,每项用{}括起,项间逗号分隔。每项中有两个数据,数据间也是逗号分隔。
  3. DataFile=WScript.Arguments(0);

  4. Stream = new ActiveXObject("ADODB.Stream");        //打开文件,逐个读取字符并判断
  5. Stream.Type=2;        //类型1是二进制,2是文本
  6. Stream.Charset = "GBK";
  7. Stream.Open;
  8. Stream.LoadFromFile(DataFile);

  9. var tstr='',iflag=n=0;
  10. var first=[],second=[];        //定义数组,用于存放两组数值
  11. while(!Stream.EOS){
  12.         Rchar=Stream.ReadText(1);
  13.         tstr+=Rchar;
  14.         if(iflag){
  15.                 if(Rchar=='}'){        //结束一条,同时是第二个数据
  16.                         iflag=0;second[n]=parseInt(tstr);        //parseInt(tstr)会去除末尾非数字部分
  17.                 }else if(Rchar==','){        //{第一个数据/逗号}
  18.                         first[n]=parseInt(tstr);tstr='';
  19.                 }
  20.         }else if(Rchar=='{'){        //开始一条
  21.                 iflag=1;tstr='';n++;
  22.         }
  23. }
  24. Stream.Close;

  25. group1=group2='';
  26. for(i=1;i<n;i++){
  27.         group1+=i+' -> '+first[i]+', ';                //一组:1 -> 1, 2 -> 9,
  28.         group2+=i+' -> '+second[i]+', ';        //二组:1 -> 352400, 2 -> 348500,
  29. }
  30. group1+=n+' -> '+first[n];
  31. group2+=n+' -> '+second[n];
  32. WSH.Echo('数据一\n'+group1+'\n\n数据二\n'+group2);
复制代码
发表于 2022-5-23 10:51:12 | 显示全部楼层
  1. #&cls&powershell "iex(gc '%~0'|out-string)"&exit\b
  2. $a="{1., 352400.11}, {9., 348500.91}, {15., 349000.76}, {21., 348800.83}, {29., 330900.75}, {37., 327100.03}, {45., 328300.43}, {49., 321300.33}, {51., 322500.64}, {62., 306700.}, {74., 314600.}"
  3. $one=[regex]::matches($a,'(?<=\{)\d+(?=\.)').value
  4. $two=[regex]::matches($a,'(?<=\s)\d+(?=\.)').value
  5. (1..$one.count|%{"$_->"+$one[$_-1]}) -join ","
  6. (1..$two.count|%{"$_->"+$two[$_-1]}) -join ","
  7. pause
复制代码
输出如下:
1->1,2->9,3->15,4->21,5->29,6->37,7->45,8->49,9->51,10->62,11->74
1->352400,2->348500,3->349000,4->348800,5->330900,6->327100,7->328300,8->321300,9->322500,10->306700,11->314600
按 Enter 键继续...:
发表于 2022-5-23 13:38:14 | 显示全部楼层
给一个纯P代码实现方案...
@echo off & setlocal enabledelayedexpansion
set "nList={1., 352400.11}, {9., 348500.91}, {15., 349000.76}, {21., 348800.83}, {29., 330900.75}, {37., 327100.03}, {45., 328300.43}, {49., 321300.33}, {51., 322500.64}, {62., 306700.}, {74., 314600.}"
set items=!nList:},=}^

!
:: 上面两个空行不能被省略
set/a n=1
for /f "tokens=1-2 delims={., " %%1 in ("!items!") do (
    set "data1=!data1!!n! -> %%1, "
    set "data2=!data2!!n! -> %%2, "
    set/a n+=1
)
echo,!data1:~,-2!
echo,!data2:~,-2!
endlocal&pause&exit/b

评分

参与人数 1技术 +1 收起 理由
for_flr + 1 这个换行妙啊

查看全部评分

发表于 2022-5-23 15:54:21 | 显示全部楼层
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "str={1., 352400.11}, {9., 348500.91}, {15., 349000.76}, {21., 348800.83}, {29., 330900.75}, {37., 327100.03}, {45., 328300.43}, {49., 321300.33}, {51., 322500.64}, {62., 306700.}, {74., 314600.}"
  4. set str=%str:{=%
  5. set str=%str:}=%
  6. set /a l=m=n=1
  7. for %%a in (%str%) do (
  8.   set /a odd=l%%2
  9.   set /a l+=1
  10.   for /f "delims=." %%i in ("%%a") do (
  11.     if !odd!==1 (
  12.       set "line1=!line1! !m! -> %%i,"
  13.       set /a m+=1
  14.     ) else (
  15.       set "line2=!line2! !n! -> %%i,"
  16.       set /a n+=1
  17.     )
  18.   )
  19. )
  20. echo;!line1!
  21. echo;!line2!
  22. pause>nul
复制代码
 楼主| 发表于 2022-5-24 20:00:56 | 显示全部楼层
谢谢您
热心网友,明天测试下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-19 23:14 , Processed in 0.021164 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表