guxingganyue 发表于 2013-5-7 08:34:34

【求助】把一个文件夹下N个txt文件中的16进制转成10进制保存

本帖最后由 guxingganyue 于 2013-5-7 08:36 编辑

如题:我要把一个文件夹下的N个txt文件中的16进制转成10进制,且把数据间的空格变成换行。谁会用批处理实现呢?
      现在我的笨方法是:用notepad++把数据间的空格替换成换行。然后再把数据放到excel中再转成10进制,效率太低。

故来求教高人能否用批处理实现---->把这个批处理文件放到文件夹中,运行批处理后就把当前文件夹下的所有txt文件中的数据安装上面的方法转换并保存(可以直接覆盖源文件,或者再新建
一个文件也可以,哪个方便用那种方法)

注:数据是我用串口发送到sscom3.2中,hex显示保存的文件。里面全是16进制的字符、空格、回车换行,没有其他字符。

txt格式:

源文件数据:4B 4E 53 58 64 6A 6F 75 79 7D
转换完后的数据:
75
78
83
88
100
106
111
117
121
125

文件夹下的txt文件:

zouzhichao 发表于 2013-5-7 09:19:21

刚写的,不知道满足要求不

guxingganyue 发表于 2013-5-7 09:20:37

zouzhichao 发表于 2013-5-7 09:19 static/image/common/back.gif
刚写的,不知道满足要求不

多谢,我试试

zouzhichao 发表于 2013-5-7 09:21:03

源代码,VC编译,你自己看着改吧,很简单
int HexTransfer(const char* FileNameSrc, const char* FileNameDst)
{
        FILE* FileSrc = fopen(FileNameSrc, "r");
        if (!FileSrc)
                return -1;
        FILE* FileDst = fopen(FileNameDst, "w");
        if (!FileDst)
                return -1;
        int Data;
        for ( ; 0 == feof(FileSrc); )
        {
                if (fscanf(FileSrc, "%X", &Data) != 1)
                        break;
                if (fprintf(FileDst, "%d\r\n", Data) == 0)
                        break;
        }
        fclose(FileSrc);
        fclose(FileDst);
        return 0;
}

zouzhichao 发表于 2013-5-7 09:23:40

批处理文件格式:
HexTransfer test0.txt
HexTransfer test1.txt
HexTransfer test2.txt
HexTransfer test3.txt
pause

运行生成 copy_test0.txt, copy_test1.txt, copy_test2.txt, copy_test4.txt

zouzhichao 发表于 2013-5-7 09:24:44

批处理文件格式(指定生成文件名):
HexTransfer test0.txt test_a.txt
HexTransfer test1.txt test_b.txt
HexTransfer test2.txt test_c.txt
HexTransfer test3.txt test_d.txt
pause

zouzhichao 发表于 2013-5-7 09:25:20

源文件名和输出文件名不要重名

guxingganyue 发表于 2013-5-7 09:25:44

本帖最后由 guxingganyue 于 2013-5-7 09:31 编辑

zouzhichao 发表于 2013-5-7 09:19 static/image/common/back.gif
刚写的,不知道满足要求不

刚测试了,转换的结果和格式都是正确的。。。

但是你是转换指定文件名的文件。

能不能改成:转换当前文件夹下所有的文件呢。不要指定文件名,运行bat后自动把所有文件都转了。

guxingganyue 发表于 2013-5-7 09:27:25

zouzhichao 发表于 2013-5-7 09:21 static/image/common/back.gif
源代码,VC编译,你自己看着改吧,很简单
int HexTransfer(const char* FileNameSrc, const char* FileName ...

电脑重装后VC一直没来得及装上,VC不是很熟。。

zouzhichao 发表于 2013-5-7 10:35:53

你再看看可行否

zouzhichao 发表于 2013-5-7 10:44:51

全部源码
#include "stdafx.h"
#include "string.h"
#include "afx.h"

int HexTransfer(const char* FileNameSrc, const char* FileNameDst)
{
        FILE* FileSrc = fopen(FileNameSrc, "r");
        if (!FileSrc)
                return -1;
        FILE* FileDst = fopen(FileNameDst, "w");
        if (!FileDst)
                return -1;
        int Data;
        for ( ; 0 == feof(FileSrc); )
        {
                if (fscanf(FileSrc, "%X", &Data) != 1)
                        break;
                if (fprintf(FileDst, "%d\r\n", Data) == 0)
                        break;
        }
        fclose(FileSrc);
        fclose(FileDst);
        return 0;
}

int FolderDeal(const char* Folder)
{
        CFileFind File;
        if (strstr(Folder, (const char*)"*"))
                return -1;
        if (File.FindFile(Folder))
                return -1;
        return CreateDirectory(Folder, NULL);
}

int FileDeal(const char* FileSrc, const char* FolderDst)
{
        CFileFind File;
        int Amount = 0;
        int Res = File.FindFile(FileSrc);
        char Buffer = {0x00};
        for ( ; Res; )
        {
                Res = File.FindNextFile();
                if (!File.IsDirectory())
                {
                        strcpy((char*)Buffer, FolderDst);
                        strcat((char*)Buffer, (const char*)"\\");
                        strcat((char*)Buffer, (const char*)File.GetFileName());
                        if (HexTransfer((const char*)File.GetFileName(), (const char*)Buffer))
                                printf("文件 %s 转换错误!\r\n", (const char*)File.GetFileName());
                        else
                        {
                                printf("文件 %s 转换成功!\r\n", (const char*)File.GetFileName());
                                Amount++;
                        }
                }
        }
        printf("共转换 %d 个文件!\r\n", Amount);
        return Amount;
}

int main(int argc, char* argv[])
{
        if (3 != argc)
        {
                printf("输入参数错误!\r\n");
                return 0;
        }
        FolderDeal((const char*)argv);
        if (FileDeal((const char*)argv, (const char*)argv) == 0)
                return 0;
        return 0;
}

guxingganyue 发表于 2013-5-7 14:58:00

zouzhichao 发表于 2013-5-7 10:44 static/image/common/back.gif
全部源码
#include "stdafx.h"
#include "string.h"


再次感谢!!!

这次输出的文件换行时多了一个回车。。。。虽然用记事本看不出来,但是用notepad++就可以了。。

能把这个多余的回车去掉吗?


zouzhichao 发表于 2013-5-7 08:34:35

把源文件里所有的   \r\n 换成 \n就可以了

guxingganyue 发表于 2013-5-7 15:12:54

zouzhichao 发表于 2013-5-7 15:06 static/image/common/back.gif
把源文件里所有的   \r\n 换成 \n就可以了

这次对了。。。。

现在可以实现我的功能了,多谢。。。


虽然你没完全用批处理写,但是功能达到了,分数就给你了。。。

zouzhichao 发表于 2013-5-7 15:14:17

这个程序有一个不完整的地方:文件名中不要有空格,如test 001.txt这种。我看你截图里面的那些文件名都没有空格,也就没有弄那个空格符的处理了,如果有要求再提

zouzhichao 发表于 2013-5-7 15:16:43

guxingganyue 发表于 2013-5-7 15:12 static/image/common/back.gif
这次对了。。。。

现在可以实现我的功能了,多谢。。。


{:handshake:} 不客气

guxingganyue 发表于 2013-5-7 15:18:29

zouzhichao 发表于 2013-5-7 15:14 static/image/common/back.gif
这个程序有一个不完整的地方:文件名中不要有空格,如test 001.txt这种。我看你截图里面的那些文件名都没有 ...

嗯,这个程序应付我的应用足够了。。。
文件名中确实不会有空格的

robincui 发表于 2016-10-21 08:47:19

这个也有用,顶一个
页: [1]
查看完整版本: 【求助】把一个文件夹下N个txt文件中的16进制转成10进制保存