Board logo

标题: [文本处理] 批处理如何把TXT转换为dat文件? [打印本页]

作者: 领航    时间: 2022-7-28 22:49     标题: 批处理如何把TXT转换为dat文件?

源文件是N多条的TXT,转换后TXT中 每一行记录分别生成一个.dat文件,详见附件

源文件是这样的
0|000821|20220722|154288846
0|002204|20220722|-23372832
1|603982|20220722|39200819
生成文件才命名规则是:第一列_第二列,   例如:0_000821.dat
作者: 领航    时间: 2022-7-28 22:51

附件怎么上传呀
作者: LJY4.0    时间: 2022-7-29 09:10

回复 2# 领航
发链接
作者: LJY4.0    时间: 2022-7-29 09:12

回复 1# 领航
是把每一行写到一个特定的.dat中吗
作者: LJY4.0    时间: 2022-7-29 09:15

把每一行写到dat中
  1. @echo off
  2. for /f "delims=" %%a in (test.txt) do (
  3. for /f "tokens=1-2 delms=^|" %%b in ("%%a") do (
  4. echo %%a>%%b-%%c.dat
  5. ))
复制代码

作者: qixiaobin0715    时间: 2022-7-29 09:58

本帖最后由 qixiaobin0715 于 2022-7-29 10:31 编辑
  1. cd "c:\txt"
  2. for /f "tokens=1-2* delims=|" %%i in (a.txt) do echo,%%i^|%%j^|%%k>"c:\news\1001\%%i_%%j.dat"
复制代码

作者: 领航    时间: 2022-7-29 10:14

qixiaobin0715 发表于 2022-7-29 09:58



  请老师把生成的文件自动放在指定的文件夹下面,如:c:\news\1001\
谢谢!
作者: 领航    时间: 2022-7-29 10:27

回复 6# qixiaobin0715
源文件a.txt的路径能不能指定为c:\txt\a.txt?
作者: 领航    时间: 2022-7-29 10:38

本帖最后由 领航 于 2022-7-30 21:54 编辑
qixiaobin0715 发表于 2022-7-29 09:58



    请问老师,如何解决增量问题
下面的内容中,日期和数量有变化,如何补充到对应的dat文件中呢?

0|000821|20220725|42156
0|002204|20220725|3332832
1|603982|20220725|735065
作者: 领航    时间: 2022-7-29 10:39

回复 4# LJY4.0


    是的
作者: 领航    时间: 2022-7-29 12:00

回复 6# qixiaobin0715


    老师好,生成的dat文件,通达信软件不识别,请帮助解决谢谢!
作者: qixiaobin0715    时间: 2022-7-29 12:15

可能是编码问题,转换编码问题可从论坛里搜索。
作者: 领航    时间: 2022-7-29 13:02

回复 12# qixiaobin0715


    请老师帮忙,一步到位吧,俺是新手,不懂呢
作者: 领航    时间: 2022-7-29 17:03

回复 5# LJY4.0


    老师好,生成的dat文件,通达信软件不识别,请帮助解决谢谢!
作者: LJY4.0    时间: 2022-7-29 17:13

回复 14# 领航
通达信软件需要什么编码
作者: 领航    时间: 2022-7-29 21:36

回复 15# LJY4.0


    我也不太懂,估计是个二进制的dat
作者: 领航    时间: 2022-7-29 22:55

回复 15# LJY4.0
刚才查了一下说是float类型;
    单纯的4字节浮点类型
作者: 领航    时间: 2022-7-29 23:08

可能是编码问题,转换编码问题可从论坛里搜索。
qixiaobin0715 发表于 2022-7-29 12:15



    老师,生成的dat是浮点格式的,麻烦您弄一下
作者: Batcher    时间: 2022-7-30 08:51

回复 2# 领航


请找一个你的通信软件可以识别的dat文件作为例子。
如果需要上传文件,可以用阿里云盘或百度网盘。
作者: 领航    时间: 2022-7-30 16:01

回复 19# Batcher

这个可以被读取
    https://wwn.lanzout.com/iM6nj08oj3xi
作者: idwma    时间: 2022-7-30 17:25

回复 20# 领航


文件里没有1,2列
只有3和4列,32位按小端排序
作者: flashercs    时间: 2022-7-30 18:13

本帖最后由 flashercs 于 2022-7-31 18:19 编辑
  1. <#*,:&cls
  2. @echo off
  3. cd /d "%~dp0"
  4. powershell -C "Set-Location -LiteralPath ([Environment]::CurrentDirectory);. ([ScriptBlock]::Create((Get-Content -LiteralPath \"%~f0\" -ReadCount 0 | Out-String)))"
  5. pause
  6. exit /b
  7. #>
  8. $txtpath = "c:\txt\a.txt"
  9. $dirdata = "c:\news\1001"
  10. $dicDataPath = @{}
  11. $rootdir = [System.IO.Directory]::CreateDirectory($dirdata)
  12. foreach ($line in (Get-Content -LiteralPath $txtpath -ReadCount 0)) {
  13.   if ($line -match '^\s*$') {
  14.     continue
  15.   }
  16.   $a, $b, $c, $d = $line -split '\|'
  17.   $datapath = [System.IO.Path]::Combine($rootdir.FullName, "${a}_${b}.dat")
  18.   if (-not $dicDataPath.ContainsKey($datapath)) {
  19.     $dicDataPath[$datapath] = 1
  20.     $filemode = [System.IO.FileMode]::Create
  21.   } else {
  22.     $filemode = [System.IO.FileMode]::Append
  23.   }
  24.   try {
  25.     $stream = New-Object System.IO.FileStream -ArgumentList @($datapath, $filemode, [System.IO.FileAccess]::Write, [System.IO.FileShare]::Read)
  26.     $bw = New-Object System.IO.BinaryWriter -ArgumentList $stream
  27.     $bw.Write($c -as [int])
  28.     $bw.Write($d -as [float])
  29.   } finally {
  30.     if ($bw) {
  31.       $bw.Close()
  32.       $bw = $null
  33.     }
  34.     if ($stream) {
  35.       $stream.Close()
  36.       $stream = $null
  37.     }
  38.   }
  39.   trap {}
  40. }
复制代码

作者: 领航    时间: 2022-7-30 21:34

回复 22# flashercs

请老师看看,
方法调用失败,因为 [System.String] 不包含名为“IsNullOrWhiteSpace”的方法。
所在位置 行:12 字符: 35
+   if ([string]::IsNullOrWhiteSpace <<<< ($line)) {
    + CategoryInfo          : InvalidOperation: (IsNullOrWhiteSpace:String) []
   , RuntimeException
    + FullyQualifiedErrorId : MethodNotFound

方法调用失败,因为 [System.IO.BinaryWriter] 不包含名为“Dispose”的方法。
所在位置 行:24 字符: 18
+       $bw.Dispose <<<< ()
    + CategoryInfo          : InvalidOperation: (Dispose:String) [], RuntimeEx
   ception
    + FullyQualifiedErrorId : MethodNotFound
作者: 领航    时间: 2022-7-30 21:35

回复 21# idwma


    不会弄,请老师帮助
作者: 领航    时间: 2022-7-30 21:55

flashercs 发表于 2022-7-30 18:13


请除了那个报错,
  请问老师,如何解决增量问题
下面的内容中,日期和数量有变化,如何补充到对应的dat文件中呢?

0|000821|20220725|42156
0|002204|20220725|3332832
1|603982|20220725|735065
作者: flashercs    时间: 2022-7-30 22:46

本帖最后由 flashercs 于 2022-7-30 22:47 编辑

回复 25# 领航


    楼上代码修复了错误,你试试.
日期更新的 行 放到a.txt 下面,会替换原来的文件.
如:
  1. 1|603982|20220722|39200819
  2. 1|603982|20220725|735065
复制代码
下行会替换上行数据.
作者: 领航    时间: 2022-7-31 10:33

本帖最后由 领航 于 2022-7-31 12:39 编辑

回复 26# flashercs


    谢谢老师修正!
现在的问题是解决增量问题;
b.txt内容
0|000821|20220725|42156
0|002204|20220725|3332832
1|603982|20220725|735065

当b.txt日期和数量发生变化,如何补充到对应的dat文件中呢?不是替换覆盖,是增量
当日期相同的时候,可以替换覆盖
当日期不同的时候,在dat里面增补一条记录


附件例子是多条记录:https://wwn.lanzout.com/imzg808q4jyh
作者: flashercs    时间: 2022-7-31 16:07

回复 27# 领航


    修改了增量问题.你需要测试一下
作者: 领航    时间: 2022-7-31 17:14

本帖最后由 领航 于 2022-7-31 17:16 编辑

回复 28# flashercs


    经测试可增补,但存在软件读取不到问题,怀疑与附件的datacfg.dat这个文件有关联,可能是每次增补一次数据,就向datacfg.dat这个文件补充一条记录,我打不开datacfg.dat这个文件,特发附件请老师分析解决
https://wwn.lanzout.com/iYlXa08r1lyh
作者: flashercs    时间: 2022-7-31 17:55

回复 29# 领航


    不知道datacfg.dat的数据是什么格式.无法判断原因
作者: 领航    时间: 2022-7-31 18:13

回复 30# flashercs


    感谢老师回复!
再问一下,这个批处理可以批量处理一批文档吧?能做在一个批处理当中吗?谢谢!
如把c:\a.txt 每一行写到一个特定的.dat  放在c:\news\1001\
      c:\c.txt   每一行写到一个特定的.dat  放在c:\news\1002\
      c:\d.txt   每一行写到一个特定的.dat  放在 c:\news\1003\
作者: flashercs    时间: 2022-7-31 18:21

回复 31# 领航


    又修改了一下代码,你试试这次能打开datacfg.dat吗
作者: 领航    时间: 2022-7-31 19:20

回复 32# flashercs

可以了。
     感谢老师回复!
再问一下,我想处理一批文档;能做在一个批处理当中吗?谢谢!
如把c:\a.txt 每一行写到一个特定的.dat  放在c:\news\1001\
      c:\c.txt   每一行写到一个特定的.dat  放在c:\news\1002\
      c:\d.txt   每一行写到一个特定的.dat  放在 c:\news\1003\
作者: flashercs    时间: 2022-7-31 20:57

本帖最后由 flashercs 于 2022-8-1 11:37 编辑

回复 33# 领航
  1. <#*,:&cls
  2. @echo off
  3. cd /d "%~dp0"
  4. powershell -C "Set-Location -LiteralPath ([Environment]::CurrentDirectory);. ([ScriptBlock]::Create((Get-Content -LiteralPath \"%~f0\" -ReadCount 0 | Out-String)))"
  5. pause
  6. exit /b
  7. #>
  8. # txtpath = dirdata
  9. $dictxtpath = @{
  10.   "c:\txt\a.txt" = "c:\news\1001"
  11.   "c:\txt\b.txt" = "c:\news\1002"
  12.   "c:\txt\c.txt" = "c:\news\1003"
  13. }
  14. function Import-WgcCsv {
  15.   # support ps2.0, -LiteralPath
  16.   [CmdletBinding(DefaultParameterSetName = 'Delimiter')]
  17.   param (
  18.     [Parameter(Mandatory = $true, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
  19.     [Alias('PSPath')]
  20.     [string[]]$LiteralPath,
  21.     [ValidateSet('ASCII', 'BigEndianUnicode', 'Default', 'OEM', 'Unicode', 'UTF7', 'UTF8', 'UTF32')]
  22.     [string]$Encoding = 'ASCII',
  23.     [Parameter(ParameterSetName = 'Delimiter')]
  24.     [char]$Delimiter = ',',
  25.     [Parameter(ParameterSetName = 'UseCulture')]
  26.     [switch]$UseCulture,
  27.     [Parameter()]
  28.     [ValidateNotNullOrEmpty()]
  29.     [string[]]$Header
  30.   )
  31.   process {
  32.     foreach ($lPath in $LiteralPath) {
  33.       trap {}
  34.       try {
  35.         $txt = (Get-Content -ReadCount 0 -LiteralPath $lPath -Encoding $Encoding) -join ([Environment]::NewLine)
  36.         if ($PSCmdlet.ParameterSetName -eq 'Delimiter') {
  37.           if ($null -ne $Header -and $Header.Count -gt 0) {
  38.             ConvertFrom-Csv -InputObject $txt -Delimiter $Delimiter -Header $Header
  39.           } else {
  40.             ConvertFrom-Csv -InputObject $txt -Delimiter $Delimiter
  41.           }
  42.         } else {
  43.           if ($null -ne $Header -and $Header.Count -gt 0) {
  44.             ConvertFrom-Csv -InputObject $txt -UseCulture:$UseCulture -Header $Header
  45.           } else {
  46.             ConvertFrom-Csv -InputObject $txt -UseCulture:$UseCulture
  47.           }
  48.         }
  49.       } finally {
  50.    
  51.       }
  52.     }
  53.   }
  54. }
  55. $sortlist = New-Object 'System.Collections.Generic.SortedList[int,float]'
  56. foreach ($txtpath in $dictxtpath.Keys) {
  57.   $txtpath
  58.   $dirdata = $dictxtpath[$txtpath]  
  59.   $rootdir = [System.IO.Directory]::CreateDirectory($dirdata)
  60.   Import-WgcCsv -LiteralPath $txtpath -Encoding UTF8 -Delimiter '|' -Header a, b, c, d | Group-Object -Property a, b | ForEach-Object {
  61.     $datapath = [System.IO.Path]::Combine($rootdir.FullName, "$($_.Values -join '_').dat")
  62.     $sortlist.Clear()
  63.     if (Test-Path -LiteralPath $datapath) {
  64.       # read data record
  65.       try {
  66.         $stream = New-Object System.IO.FileStream -ArgumentList @($datapath, [System.IO.FileMode]::Open, [System.IO.FileAccess]::Read, [System.IO.FileShare]::Read)
  67.         $br = New-Object System.IO.BinaryReader -ArgumentList $stream
  68.         while ($true) {
  69.           $key = $br.ReadInt32()
  70.           $value = $br.ReadSingle()
  71.           $sortlist[$key] = $value
  72.         }
  73.       } catch {}
  74.       finally {
  75.         if ($br) {
  76.           $br.Close()
  77.           $br = $null
  78.         }
  79.         if ($stream) {
  80.           $stream.Close()
  81.           $stream = $null
  82.         }
  83.       }
  84.     }
  85.     # add txt record
  86.     foreach ($pso in $_.Group) {
  87.       $sortlist[($pso.c -as [int])] = $pso.d -as [float]
  88.     }
  89.     # write data record
  90.     try {
  91.       $stream = New-Object System.IO.FileStream -ArgumentList @($datapath, [System.IO.FileMode]::Create, [System.IO.FileAccess]::Write, [System.IO.FileShare]::Read)
  92.       $bw = New-Object System.IO.BinaryWriter -ArgumentList $stream
  93.       foreach ($key in $sortlist.Keys) {
  94.         $bw.Write($key)
  95.         $bw.Write($sortlist[$key])
  96.       }
  97.     } finally {
  98.       if ($bw) {
  99.         $bw.Close()
  100.         $bw = $null
  101.       }
  102.       if ($stream) {
  103.         $stream.Close()
  104.         $stream = $null
  105.       }
  106.     }
  107.     trap {}
  108.   }
  109. }
复制代码

作者: 领航    时间: 2022-7-31 23:45

本帖最后由 领航 于 2022-8-1 00:01 编辑

回复 34# flashercs

报告老师,经反复测试,可以批量生成dat,但是软件读取不了,经比对,怀疑是之前的dat里面的历史数据都没有了,麻烦您分析一下是什么原因,谢谢!
附件里面是,单个导入和批量导入的前后文件,提供给老师参考https://wwn.lanzout.com/iBbDt08s090b
作者: flashercs    时间: 2022-8-1 11:39

回复 35# 领航


    34楼修改了
作者: 领航    时间: 2022-8-1 12:00

回复 36# flashercs

请问老师,下面这个批处理,a.bat,b.bat,c,bat.d.bat分别运行完了,那些窗口怎么自动关闭?
    @echo off

start b.bat
start a.bat
start c.bat
start d.bat
exit
作者: 领航    时间: 2022-8-1 12:46

回复 36# flashercs


    还是不行,不麻烦老师了,我就一个一个运行吧




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2