[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 【已解决】求助批处理实现文本分列

本帖最后由 jave000 于 2021-9-10 10:13 编辑

同类搜索简述:
按创建和修改时间将一批文本文件,从一个文件夹批量复制到另一个文件夹,并且两个文件夹的路径中间都有一个变量,需要手动输入,以及其中一个路径涉及到桌面,但为了可以分享给同事使用,识别任意电脑名下的桌面路径。
同时对所有文本的内容,筛出以序号为行首的内容,并对其进行分列,再转换到csv文件,同时增加一列生成其文本文件名。
同时自动打开excel。
每一行的文本分列后,都归入独立单元格。
感谢楼下诸位

@powershell -c "Get-Content '%~0' | Select-Object -Skip 1 | Out-String | Invoke-Expression" & exit /b
$jave = read-host "Project Model Folder"
$CXMPV = [Environment]::GetFolderPath("Desktop")
$sour = "\\btssvr9\pds1\$jave\3d\su\report\"
$dest = "$CXMPV\Print\"
do
{
    $minute = read-host "Minutes of Minutes"
    $minute = $minute.trim()
}
while ($minute -match "\D")
Get-ChildItem -Path $sour -File *.txt |
    Where-Object { ($_.CreationTime -gt (get-date).AddMinutes(-$minute)) -or ($_.LastWriteTime -gt (get-date).AddMinutes(-$minute)) } |
    foreach-object {
        write-host $_.fullname
        copy-item $_.fullname -Destination $dest
    }
Get-Item *.txt | ForEach-Object {
    (Get-Content $_) -match "\s{3}\d+\s" `
        -replace "^\s+(\d+)\s+([\d.]+)\s+",($_.BaseName + "`t`$1`t`$2`t") `
        -replace "\s+$","" `
        -replace "\s{2,}","`t" `
        -replace "(?=Baseplate)","`t" `
        -replace " (?=\d+x\d+x\d+mm)","`t" `
} | Out-File z-report.csv
Remove-Item $dest*.txt

回复 1# jave000


    请把附件上传到阿里云盘或百度网盘
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

本帖最后由 jave000 于 2021-8-20 14:34 编辑

回复 2# Batcher


    公司电脑也打不开任何网盘的网址。我晚些还是把附件发给家里电脑,晚上再传。

TOP

  1. @echo off&setlocal enabledelayedexpansion
  2. (for /f "delims=" %%b in ('findstr /r /c:"^ *[0-9]" "MOC922.txt"') do (
  3. set str=%%b
  4. echo;!str:~0,8!,!str:~8,8!,!str:~16,6!,!str:~22,40!,!str:~62,40!,!str:~102,16!,!str:~118!
  5. ))>>MOC922.txt.csv
  6. pause
复制代码
1

评分人数

TOP

回复 1# jave000
不用字符宽度的话,可以牵强的这么处理:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. (for /f "tokens=*" %%i in ('findstr /br /c:" *[1-9][0-9]* " MOC922.txt') do (
  4.     set "str1=%%i"
  5.     set "str1=!str1:  =#!"
  6.     for /f "tokens=1-7 delims=#" %%a in ("!str1:# =#!") do echo,%%a,%%b,%%c,%%d,%%e,%%f,%%g
  7. ))>1.csv
  8. pause
复制代码
但是会带来一些问题,比如17行由于第4列为空白,就会导致后面各列依次前移。
1

评分人数

    • jave000: 路径是全C盘?技术 + 1

TOP

回复 3# jave000
/c:是findstr命令中的一个参数,而不是路径。参见:
http://bbs.bathome.net/thread-14682-1-1.html
1

评分人数

TOP

本帖最后由 newswan 于 2021-8-23 12:46 编辑

如果列内字符串中空格不超过1个
  1. (Get-Content -Encoding utf8 $_ | Select-String -Pattern '^\s+\d') -replace "\s{2,}",","
复制代码
1

评分人数

    • jave000: 虽然看了书,但是"\s{2,}",","技术 + 1

TOP

回复 1# jave000
cmd1152就是个极其活跃的小魔头!

TOP

回复 7# newswan


    虽然看了书,但是"\s{2,}",","还是没看懂……

TOP

回复 9# jave000
两个及两个以上的空白字符替换为英文逗号。

TOP

回复 10# qixiaobin0715


    谢谢,懂了

TOP

回复 1# jave000


   
另外请cmd1152不要再在我的网盘空间刷屏了,刷了一个月,真的是怕了

    .............
   
    为什么你的名字:jave000和空间名asaman不一样?
梦依旧在,只是,心有余而力渐有不足
年年岁岁花相似,岁岁年年人不同

TOP

回复 8# qixiaobin0715


   
cmd1152就是个极其活跃的小魔头!

    我无语了呀..................
梦依旧在,只是,心有余而力渐有不足
年年岁岁花相似,岁岁年年人不同

TOP

本帖最后由 jave000 于 2021-8-31 10:49 编辑

回复 4# idwma


    谢谢,我刚发现其实有第八列remark,不过这个我自己会改了
!str:~118!是否是表达从118往后任意字符?所以不用写几个字符
我把第一个文件名改为*,可以生成,但是列宽全乱了
MOC320.t        xt:   10        4             Pcs   Hexagon head bolt                               ISO 4014 - M12x45                               8.8 S        t               0.276

就感觉在判定列宽时需要提前预留出文件名的名称列宽,但是不知道怎么取消txt后缀以及诡异的冒号
我又尝试了预留第一列列宽,结果后面依然是错位的,需要将实际列宽减少才大部分正确,感觉这个很奇怪

@echo off&setlocal enabledelayedexpansion
(for /f "delims=" %%i in ('findstr /br /c:" *[0-9]" "*.txt"') do (
        set str=%%i
        echo;!str:~0,14!,!str:~14,8!,!str:~22,8!,!str:~30,6!,!str:~36,40!,!str:~76,40!,!str:~116,16!,!str:~132,8!,!str:~140!
))>z-su.csv

TOP

本帖最后由 jave000 于 2021-8-31 10:56 编辑

回复 5# qixiaobin0715


   谢谢,请问一下
/r /c:"^ 和 /br /c:"  是否没有区别?
“*[1-9][0-9]*”为什么可以表达个位数?我写成“[0-9]?”结果完全是空格……主要是不明白两头的星号表达什么。
并且我把idwma的“*[0-9]*”改成了“*[1-9][0-9]*”,他就不再显示个位数行了,但你的可以,很费解
第一列显示moc922.txt:而不是moc922,请问这个是哪段代码表达的?“%%a in ()”?
整体思路我看明白是把每两个空格改成#,再把“# ”替换为“#”,然后通过#来分割字段,这里好奇,是否已经能将连续的多个#认为是一个#?
发现另一个文本也有错位问题,第一行的二三列分不开,第九行的七八列分不开。能否强制使“ m”分列?
关于过长空格,能否有什么代码可以判断大于某个数量的空格可以认为是一列?
   1    11.3448 m     HW-Beam                                 HW100X100                               St37-1         187.379                              
   2    14      Pcs   A-Plate 16401                           A-Pl16401 200x200x10                    St37-1          43.960                              
   3    1       Pcs   C-Plate 12401                           C-Pl12401_1 240x210x10                  St37-1           3.956                              
   4    4       Pcs   Trägerklemme                            HCS TK                                  St37-1           1.732                              
   5    4       Pcs   Hexagon head bolt                       ISO 4014 - M12x40                       8.8 St           0.256                              
   6    4       Pcs   Hexagon nut                             ISO 4032 - M12                          8.8 St           0.100                              
   7    8       Pcs   Washer                                  ISO 7090-12                             8.8 St           0.048                              
   8    56      Pcs   Duty anchor + HIT-HY150                 HAS M16x125/38                          5.6 St           7.000                              
   9    0.252   m3                                            Baseplate                               Concrete       630.000 300x300x200mm

TOP

返回列表