多谢坛友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批处理代码