[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]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

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

回复 2# Batcher


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

TOP

回复 7# newswan


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

TOP

回复 10# qixiaobin0715


    谢谢,懂了

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

回复 7# newswan


    谢谢,有很多样本,分列中间只有一个空格,只能按宽度了,这个分列其实比较简单,用cmd也够用了
你的这个我抄不来后面该怎么写,尝试失败

TOP

回复 18# qixiaobin0715


    谢谢,按照宽度我试了很久,发现更多问题,还是你这个生成后手改更容易一些
还想请问
/br是否表示/b /r?
moc922.txt:看起来是自动生成的,能否将.txt:全部自动删除?
在for循环中,若干个连续字符,是否等同于单个该字符?(也就是说1,2和1,,,,2都一样只会分成1和2两个字段)

TOP

回复 20# newswan


    看起来第一行二三列你分开了啊

TOP

回复 23# qixiaobin0715


    因为我文件夹里不止一个MOC922.txt,你的代码里我把MOC922.txt改成了*.txt再运行
若干个txt生成结果就是额外自动生成了第一列

TOP

回复 25# qixiaobin0715


      要保留的,单独一列。
所有文件都是一样的,只要第一步将“ m”改为“  m”,“0 3”改为“0  3”就行,然后继续双空格替换为“#”,”# “替换为“#”,这些我大概会改。
就是好奇为什么不需要将若干个连续的“#*”替换为“#”?

TOP

本帖最后由 jave000 于 2021-8-31 17:12 编辑

回复 22# newswan


    @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 |
    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 + ",`$1,`$2,") -replace "\s{2,}","," -replace "Baseplate",",Baseplate" } | Out-File z-su.csv
Invoke-Item $sour

尝试了一下,我们服务器网盘的文件无法直接处理,只能先复制过来,再处理,但是powershell删除$dest目录下所有txt是什么句式我还不知道
另外我转成csv或txt,都没有自动分列,都在同一列,remarks分列我可以自己想想
这个环视替换挺有用,cmd要是也能用就好了
也想着把时间判定删掉,只保留以下,但是运行失败了
Get-ChildItem -Path $sour -File |
    foreach-object {
        write-host $_.fullname
        copy-item $_.fullname -Destination $dest

TOP

本帖最后由 jave000 于 2021-9-1 09:12 编辑

回复 38# newswan


    Remove-Item -Path $dest * -Include .txt
    Remove-Item -Path $dest\ * -Include .txt
    Remove-Item -Path $dest\* -Include .txt
    Remove-Item -Path $dest -Include *.txt
    Remove-Item -Path $dest *.txt
    Remove-Item -Path $dest\*.txt
我试了如上的代码,全都无法删除txt,请问是为什么?

所以`t表示分列符号喽,你prt代码我又多看懂一点

TOP

回复 38# newswan


目前写成这样,就完美使用了,只有最后一句删除的代码怎么改也无法成功。
@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 |
    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-su.csv
Invoke-Item -Path $sour
Remove-Item -Path $dest -File *.txt

TOP

回复 31# qixiaobin0715


     这几天正在学习for、set、if,现在印象更深了,谢谢

TOP

返回列表