求一段BAT批处理代码

搬瓦工机场JMS

多谢坛友stanway相助,已解决。

a.txt中存放几十万条数据,一行一条,想从a.txt中提取200行放入b.txt中,然后删除a.txt中已提取的那200条数据,运行第二次时,继续提取200条覆盖b.txt中的数据,然后再删除a.txt中已提取的那200条数据,直到全部提取完。
这几天一直百度搜索相关代码,由于我基础太差。一直没找到合适的。所以只好有求坛友了。可以适当报酬。谢谢
山东网友:刚用 C# 帮大家开发了一个, 需要NET框架4.7.2环境。
任意编码[多国语言]导入,UTF8编码导出/覆盖,删除功能可选。
https://drive.google.com/open?id=1RIb_1CvtTkKtS0pkKEeqk7phswSxP3Jh
各位自行取用吧,主要难在编码的判断和转换,也没花多长时间。
这东西受众还是挺多的吧。效率工具。
江苏网友:已经用批处理搞定了。

@echo off
setlocal ENABLEDELAYEDEXPANSION
chcp 65001
cd .>b.txt
cd .>tmp.txt
set /a c=0
for /f "delims=[" %%i in (a.txt) do (
set /a c+=1
if !c! leq 200 (echo %%i>>b.txt) else (echo %%i>>tmp.txt)
)
del /q a.txt
ren tmp.txt a.txt
exit
广西网友:帮顶
四川网友:用shell,或则其他语言行不行?
江西网友:bat无法删除或者替换文件内容!
澳门网友:用python可以,很简单
陕西网友:大佬如果要定做,可以点击左边QQ即可,很简单的功能
河北网友:
pythoner 表示要是用python三分钟给你写出来 顺带,学点python吧,简单粗暴,学完file就能干这个
贵州网友:用python吧,可以找我,很简单的
黑龙江网友:exe文件不行吗?
台湾网友:我百度搜索一下网上的内容,好像可以实现这个功能,不过我没找到一个适用的。呵。我再找找,谢谢。
河南网友:我百度搜索一下网上的内容,好像可以实现这个功能,不过我没找到一个适用的。呵。我再找找,谢谢。
湖南网友:多谢建议,不过想想四十好几了,就不为难自己了,谢谢。
青海网友:出几个钱找人做呀,确实没必要为难自己
江西网友:刚用 C# 帮大家开发了一个, 需要NET框架4.7.2环境。
任意编码[多国语言]导入,UTF8编码导出/覆盖,删除功能可选。
https://drive.google.com/open?id=1RIb_1CvtTkKtS0pkKEeqk7phswSxP3Jh
各位自行取用吧,主要难在编码的判断和转换,也没花多长时间。
这东西受众还是挺多的吧。效率工具。
吉林网友:可以实现的。for /f就行了。有文件操作。
新疆网友:直接删除这个文件之后新建一个同名文件
香港网友:拿了的人不说一声吗?效果怎么样
河南网友:能否麻烦你帮我写一下。
吉林网友:你这是啥意思?我不是已经写好了一个给你?
广西网友:这是源码。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace data_helper_loc
{
    class Program
    {
        public static System.Text.Encoding GetType(string FILE_NAME)
        {
            FileStream fs = new FileStream(FILE_NAME, FileMode.Open, FileAccess.Read);
            Encoding r = GetType(fs);
            fs.Close();
            return r;
        }
        public static System.Text.Encoding GetType(FileStream fs)
        {
            byte[] Unicode = new byte[] { 0xFF, 0xFE, 0x41 };
            byte[] UnicodeBIG = new byte[] { 0xFE, 0xFF, 0x00 };
            byte[] UTF8 = new byte[] { 0xEF, 0xBB, 0xBF }; //带BOM
            Encoding reVal = Encoding.Default;

            BinaryReader r = new BinaryReader(fs, System.Text.Encoding.Default);
            int i;
            int.TryParse(fs.Length.ToString(), out i);
            byte[] ss = r.ReadBytes(i);
            if (IsUTF8Bytes(ss) || (ss[0] == 0xEF && ss[1] == 0xBB && ss[2] == 0xBF))
            {
                reVal = Encoding.UTF8;
            }
            else if (ss[0] == 0xFE && ss[1] == 0xFF && ss[2] == 0x00)
            {
                reVal = Encoding.BigEndianUnicode;
            }
            else if (ss[0] == 0xFF && ss[1] == 0xFE && ss[2] == 0x41)
            {
                reVal = Encoding.Unicode;
            }
            r.Close();
            return reVal;

        }
        private static bool IsUTF8Bytes(byte[] data)
        {
            int charByteCounter = 1;
            byte curByte;
            for (int i = 0; i < data.Length; i++)
            {
                curByte = data[i];
                if (charByteCounter == 1)
                {
                    if (curByte >= 0x80)
                    {
                        while (((curByte <<= 1) & 0x80) != 0)
                        {
                            charByteCounter++;
                        }
                        if (charByteCounter == 1 || charByteCounter > 6)
                        {
                            return false;
                        }
                    }
                }
                else
                {
                    if ((curByte & 0xC0) != 0x80)
                    {
                        return false;
                    }
                    charByteCounter–;
                }
            }
            if (charByteCounter > 1)
            {
                throw new Exception("非预期的byte格式");
            }
            return true;
        }

        static void Main(string[] args)
        {
            List<string> data_lines = new List<string>();
            Console.Title = "数据提取器(自适应编码版) 任意编码导入-UTF8编码导出/覆盖 Hostloc坛友stanway开发 QQ116243714 仅供学习交流使用";
            Console.WriteLine("数据提取器(自适应编码版) 任意编码导入-UTF8编码导出/覆盖");
            Console.WriteLine(" —Hostloc坛友stanway 于 2019年11月24日 友情开发, 仅供学习交流使用, 严禁非法用途!");
            Console.WriteLine("有软件开发、脚本开发、网页前后端开发及各种需求的可以联系 QQ116243714");
            Console.WriteLine("请输入导入文件名(必须在同一目录下):");
            string Input_File_Name = Console.ReadLine();
            int Input_Count = 0;
            Console.WriteLine("导入中… 时长主要取决于磁盘I/O速度!");

            using (StreamReader sr = new StreamReader(Input_File_Name, GetType(Input_File_Name)))
            {
                string Line = "";
                while((Line = sr.ReadLine()) != null)
                {
                    data_lines.Add(Line);
                    Input_Count++;
                }
            }

            Console.WriteLine("导入成功, 共导入数据 " + Convert.ToString(Input_Count) + " 行!");
            Console.WriteLine("请输入导出行数(从第1行开始):");
            int Output_Count = Convert.ToInt32(Console.ReadLine());
            if(Output_Count > Input_Count)
            {
                Output_Count = Input_Count;
                Console.WriteLine("输入的导出行数大于导入行数, 已将导出行数设置为最大值 " + Convert.ToString(Input_Count) + " 行。");
            }

            Console.WriteLine("请输入导出文件名(必须在同一目录下):");
            string Output_File_Name = Console.ReadLine();
            Console.WriteLine("是否要在原文件中删除此次导出的数据? (y/n)");
            string delete_flag = Console.ReadLine();
            if (delete_flag.Contains("y"))
            {
                Console.WriteLine("正在覆盖原文件中… 时长主要取决于磁盘I/O速度! 警告: 此时关闭程序将导致数据丢失!");
                using (StreamWriter sw = new StreamWriter(Input_File_Name, false, System.Text.Encoding.UTF8))
                {
                    if(Input_Count == data_lines.Count)
                    {
                        sw.WriteLine("");
                    }
                    for (int i = Output_Count; i < data_lines.Count; i++)
                    {
                        sw.WriteLine(data_lines[i]);
                    }
                }
                Console.WriteLine("覆盖完毕! 原文件的编码现在为 UTF8");
            }

            using (StreamWriter sw = new StreamWriter(Output_File_Name, false, System.Text.Encoding.UTF8))
            {
                if (Output_Count == 0)
                {
                    sw.WriteLine("");
                }
                for (int i = 0; i < Output_Count; i++)
                {
                    sw.WriteLine(data_lines[i]);
                }
            }
            Console.WriteLine("处理完毕! 导出文件的编码为UTF8, 按任意键退出…");
            Console.ReadKey();
        }
    }
}
台湾网友:这是源码。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace data_helper_loc
{
    class Program
    {
        public static System.Text.Encoding GetType(string FILE_NAME)
        {
            FileStream fs = new FileStream(FILE_NAME, FileMode.Open, FileAccess.Read);
            Encoding r = GetType(fs);
            fs.Close();
            return r;
        }
        public static System.Text.Encoding GetType(FileStream fs)
        {
            byte[] Unicode = new byte[] { 0xFF, 0xFE, 0x41 };
            byte[] UnicodeBIG = new byte[] { 0xFE, 0xFF, 0x00 };
            byte[] UTF8 = new byte[] { 0xEF, 0xBB, 0xBF }; //带BOM
            Encoding reVal = Encoding.Default;

            BinaryReader r = new BinaryReader(fs, System.Text.Encoding.Default);
            int i;
            int.TryParse(fs.Length.ToString(), out i);
            byte[] ss = r.ReadBytes(i);
            if (IsUTF8Bytes(ss) || (ss[0] == 0xEF && ss[1] == 0xBB && ss[2] == 0xBF))
            {
                reVal = Encoding.UTF8;
            }
            else if (ss[0] == 0xFE && ss[1] == 0xFF && ss[2] == 0x00)
            {
                reVal = Encoding.BigEndianUnicode;
            }
            else if (ss[0] == 0xFF && ss[1] == 0xFE && ss[2] == 0x41)
            {
                reVal = Encoding.Unicode;
            }
            r.Close();
            return reVal;

        }
        private static bool IsUTF8Bytes(byte[] data)
        {
            int charByteCounter = 1;
            byte curByte;
            for (int i = 0; i < data.Length; i++)
            {
                curByte = data[i];
                if (charByteCounter == 1)
                {
                    if (curByte >= 0x80)
                    {
                        while (((curByte <<= 1) & 0x80) != 0)
                        {
                            charByteCounter++;
                        }
                        if (charByteCounter == 1 || charByteCounter > 6)
                        {
                            return false;
                        }
                    }
                }
                else
                {
                    if ((curByte & 0xC0) != 0x80)
                    {
                        return false;
                    }
                    charByteCounter–;
                }
            }
            if (charByteCounter > 1)
            {
                throw new Exception("非预期的byte格式");
            }
            return true;
        }

        static void Main(string[] args)
        {
            List<string> data_lines = new List<string>();
            Console.Title = "数据提取器(自适应编码版) 任意编码导入-UTF8编码导出/覆盖 Hostloc坛友stanway开发 QQ116243714 仅供学习交流使用";
            Console.WriteLine("数据提取器(自适应编码版) 任意编码导入-UTF8编码导出/覆盖");
            Console.WriteLine(" —Hostloc坛友stanway 于 2019年11月24日 友情开发, 仅供学习交流使用, 严禁非法用途!");
            Console.WriteLine("有软件开发、脚本开发、网页前后端开发及各种需求的可以联系 QQ116243714");
            Console.WriteLine("请输入导入文件名(必须在同一目录下):");
            string Input_File_Name = Console.ReadLine();
            int Input_Count = 0;
            Console.WriteLine("导入中… 时长主要取决于磁盘I/O速度!");

            using (StreamReader sr = new StreamReader(Input_File_Name, GetType(Input_File_Name)))
            {
                string Line = "";
                while((Line = sr.ReadLine()) != null)
                {
                    data_lines.Add(Line);
                    Input_Count++;
                }
            }

            Console.WriteLine("导入成功, 共导入数据 " + Convert.ToString(Input_Count) + " 行!");
            Console.WriteLine("请输入导出行数(从第1行开始):");
            int Output_Count = Convert.ToInt32(Console.ReadLine());
            if(Output_Count > Input_Count)
            {
                Output_Count = Input_Count;
                Console.WriteLine("输入的导出行数大于导入行数, 已将导出行数设置为最大值 " + Convert.ToString(Input_Count) + " 行。");
            }

            Console.WriteLine("请输入导出文件名(必须在同一目录下):");
            string Output_File_Name = Console.ReadLine();
            Console.WriteLine("是否要在原文件中删除此次导出的数据? (y/n)");
            string delete_flag = Console.ReadLine();
            if (delete_flag.Contains("y"))
            {
                Console.WriteLine("正在覆盖原文件中… 时长主要取决于磁盘I/O速度! 警告: 此时关闭程序将导致数据丢失!");
                using (StreamWriter sw = new StreamWriter(Input_File_Name, false, System.Text.Encoding.UTF8))
                {
                    if(Input_Count == data_lines.Count)
                    {
                        sw.WriteLine("");
                    }
                    for (int i = Output_Count; i < data_lines.Count; i++)
                    {
                        sw.WriteLine(data_lines[i]);
                    }
                }
                Console.WriteLine("覆盖完毕! 原文件的编码现在为 UTF8");
            }

            using (StreamWriter sw = new StreamWriter(Output_File_Name, false, System.Text.Encoding.UTF8))
            {
                if (Output_Count == 0)
                {
                    sw.WriteLine("");
                }
                for (int i = 0; i < Output_Count; i++)
                {
                    sw.WriteLine(data_lines[i]);
                }
            }
            Console.WriteLine("处理完毕! 导出文件的编码为UTF8, 按任意键退出…");
            Console.ReadKey();
        }
    }
}
台湾网友:导入文件名:a.txt
导出文件名:b.txt
导出行数:200
是否删除:y
这个参数对吧?我给你写死
西藏网友:
我可以给你写个 C++ / 批处理 的,无需依赖库
天津网友:用python写爬虫的时候弄过,用来提取网址了
河北网友:chcp 65001
用这个可以解决批处理中文问题了,现在正在写
贵州网友:不好意思,你那一个我还没办法下载。
非常感谢您的热心。
江西网友:已经用批处理搞定了。

@echo off
setlocal ENABLEDELAYEDEXPANSION
chcp 65001
cd .>b.txt
cd .>tmp.txt
set /a c=0
for /f "delims=[" %%i in (a.txt) do (
set /a c+=1
if !c! leq 200 (echo %%i>>b.txt) else (echo %%i>>tmp.txt)
)
del /q a.txt
ren tmp.txt a.txt
exit
香港网友:
需要提醒的是:由于windows设计的原因,批处理的效率低下,如果用 C++ 的 fread(linux下/windows下) 或 mmap(最快,仅限linux下) 做底层文件读写,你这个几十万条数据可以秒级处理完,用批处理理论下限也要几分钟。
江西网友:
多谢兄台相助,我试着运行了一下,还有一个问题,就是运行一次后,a.txt中前200行数据并没有删除,所以多次运行后,b.txt文件里的内容还是一样,这点能否再帮我解决一下,另外还有一点,运行后能否自动关闭cmd这个窗口?多谢多谢!
湖北网友:看了半天帖子,原来是你。。。。
这又是哪个淘客程序要用到的功能。。。
云南网友:看了半天帖子,原来是你。。。。
这又是哪个淘客程序要用到的功能。。。
广东网友:谁说没有删除?你怎么搞的!我远程给你看一下!
新疆网友:已经远程看过了,没有任何问题,只是你还没等运行完就关掉了程序

未经允许不得转载:美国VPS_搬瓦工CN2 GIA VPS » 求一段BAT批处理代码

赞 (0) 打赏

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏