标题: [文本处理] 批处理如何把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中- @echo off
- for /f "delims=" %%a in (test.txt) do (
- for /f "tokens=1-2 delms=^|" %%b in ("%%a") do (
- echo %%a>%%b-%%c.dat
- ))
复制代码
作者: qixiaobin0715 时间: 2022-7-29 09:58
本帖最后由 qixiaobin0715 于 2022-7-29 10:31 编辑
- cd "c:\txt"
- 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 编辑
- <#*,:&cls
- @echo off
- cd /d "%~dp0"
- powershell -C "Set-Location -LiteralPath ([Environment]::CurrentDirectory);. ([ScriptBlock]::Create((Get-Content -LiteralPath \"%~f0\" -ReadCount 0 | Out-String)))"
- pause
- exit /b
- #>
- $txtpath = "c:\txt\a.txt"
- $dirdata = "c:\news\1001"
- $dicDataPath = @{}
- $rootdir = [System.IO.Directory]::CreateDirectory($dirdata)
- foreach ($line in (Get-Content -LiteralPath $txtpath -ReadCount 0)) {
- if ($line -match '^\s*$') {
- continue
- }
- $a, $b, $c, $d = $line -split '\|'
- $datapath = [System.IO.Path]::Combine($rootdir.FullName, "${a}_${b}.dat")
- if (-not $dicDataPath.ContainsKey($datapath)) {
- $dicDataPath[$datapath] = 1
- $filemode = [System.IO.FileMode]::Create
- } else {
- $filemode = [System.IO.FileMode]::Append
- }
- try {
- $stream = New-Object System.IO.FileStream -ArgumentList @($datapath, $filemode, [System.IO.FileAccess]::Write, [System.IO.FileShare]::Read)
- $bw = New-Object System.IO.BinaryWriter -ArgumentList $stream
- $bw.Write($c -as [int])
- $bw.Write($d -as [float])
- } finally {
- if ($bw) {
- $bw.Close()
- $bw = $null
- }
- if ($stream) {
- $stream.Close()
- $stream = $null
- }
- }
- trap {}
- }
复制代码
作者: 领航 时间: 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|603982|20220722|39200819
- 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# 领航 - <#*,:&cls
- @echo off
- cd /d "%~dp0"
- powershell -C "Set-Location -LiteralPath ([Environment]::CurrentDirectory);. ([ScriptBlock]::Create((Get-Content -LiteralPath \"%~f0\" -ReadCount 0 | Out-String)))"
- pause
- exit /b
- #>
- # txtpath = dirdata
- $dictxtpath = @{
- "c:\txt\a.txt" = "c:\news\1001"
- "c:\txt\b.txt" = "c:\news\1002"
- "c:\txt\c.txt" = "c:\news\1003"
- }
- function Import-WgcCsv {
- # support ps2.0, -LiteralPath
- [CmdletBinding(DefaultParameterSetName = 'Delimiter')]
- param (
- [Parameter(Mandatory = $true, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
- [Alias('PSPath')]
- [string[]]$LiteralPath,
- [ValidateSet('ASCII', 'BigEndianUnicode', 'Default', 'OEM', 'Unicode', 'UTF7', 'UTF8', 'UTF32')]
- [string]$Encoding = 'ASCII',
- [Parameter(ParameterSetName = 'Delimiter')]
- [char]$Delimiter = ',',
- [Parameter(ParameterSetName = 'UseCulture')]
- [switch]$UseCulture,
- [Parameter()]
- [ValidateNotNullOrEmpty()]
- [string[]]$Header
- )
- process {
- foreach ($lPath in $LiteralPath) {
- trap {}
- try {
- $txt = (Get-Content -ReadCount 0 -LiteralPath $lPath -Encoding $Encoding) -join ([Environment]::NewLine)
- if ($PSCmdlet.ParameterSetName -eq 'Delimiter') {
- if ($null -ne $Header -and $Header.Count -gt 0) {
- ConvertFrom-Csv -InputObject $txt -Delimiter $Delimiter -Header $Header
- } else {
- ConvertFrom-Csv -InputObject $txt -Delimiter $Delimiter
- }
- } else {
- if ($null -ne $Header -and $Header.Count -gt 0) {
- ConvertFrom-Csv -InputObject $txt -UseCulture:$UseCulture -Header $Header
- } else {
- ConvertFrom-Csv -InputObject $txt -UseCulture:$UseCulture
- }
- }
- } finally {
-
- }
- }
- }
- }
- $sortlist = New-Object 'System.Collections.Generic.SortedList[int,float]'
- foreach ($txtpath in $dictxtpath.Keys) {
- $txtpath
- $dirdata = $dictxtpath[$txtpath]
- $rootdir = [System.IO.Directory]::CreateDirectory($dirdata)
-
- Import-WgcCsv -LiteralPath $txtpath -Encoding UTF8 -Delimiter '|' -Header a, b, c, d | Group-Object -Property a, b | ForEach-Object {
- $datapath = [System.IO.Path]::Combine($rootdir.FullName, "$($_.Values -join '_').dat")
- $sortlist.Clear()
- if (Test-Path -LiteralPath $datapath) {
- # read data record
- try {
- $stream = New-Object System.IO.FileStream -ArgumentList @($datapath, [System.IO.FileMode]::Open, [System.IO.FileAccess]::Read, [System.IO.FileShare]::Read)
- $br = New-Object System.IO.BinaryReader -ArgumentList $stream
- while ($true) {
- $key = $br.ReadInt32()
- $value = $br.ReadSingle()
- $sortlist[$key] = $value
- }
- } catch {}
- finally {
- if ($br) {
- $br.Close()
- $br = $null
- }
- if ($stream) {
- $stream.Close()
- $stream = $null
- }
- }
- }
- # add txt record
- foreach ($pso in $_.Group) {
- $sortlist[($pso.c -as [int])] = $pso.d -as [float]
- }
- # write data record
- try {
- $stream = New-Object System.IO.FileStream -ArgumentList @($datapath, [System.IO.FileMode]::Create, [System.IO.FileAccess]::Write, [System.IO.FileShare]::Read)
- $bw = New-Object System.IO.BinaryWriter -ArgumentList $stream
- foreach ($key in $sortlist.Keys) {
- $bw.Write($key)
- $bw.Write($sortlist[$key])
- }
- } finally {
- if ($bw) {
- $bw.Close()
- $bw = $null
- }
- if ($stream) {
- $stream.Close()
- $stream = $null
- }
- }
- trap {}
- }
- }
复制代码
作者: 领航 时间: 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 |