深度学习数据集转换操做遇到一些繁琐替换,写了几个函数方便批处理。
#include <QCoreApplication>
#include <QFileInfo>
#include <QFileInfoList>
#include <QDir>
#include <QFile>
#include <QTextStream>
void DeleteOneline(int nNum, QString &strall)//
{
int nLine=0;
int Index=0;
//算出行数nLine
while(Index!=-1)
{
Index=strall.indexOf('\n',Index+1);
nLine++;
}
//如果是直接从位置0开始删除\n算一个字符"abc\nme\ndo" \n的index是3要删除3+1个字符,即index+1个
if(nNum==0)
{
int nIndex=strall.indexOf('\n');
strall.remove(0,nIndex+1);
}
else
{
int nTemp=nNum;
int nIndex=0,nIndex2=0;
while(nTemp--)
{
//
nIndex=strall.indexOf('\n',nIndex+1);//这里会更新nIndex
if(nIndex!=-1)//说明是有效的
{
nIndex2=strall.indexOf('\n',nIndex+1);
}
}
//删除的行不是最后一行(从nIndex+1这个位置起nIndex2-nIndex个字符全部抹去)
if(nNum<nLine-1)
{
strall.remove(nIndex+1, nIndex2-nIndex);//不用减一
}
//删除的是最后一行(从nIndex起始len-nIndex个字符全抹去)
//不能从nIndex+1处开始,
else if(nNum==nLine-1)
{
int len=strall.length();
strall.remove(nIndex,len-nIndex);
}
else
{
}
}
}
void deleteOnelineInFile(int nNumLine, QString &filename)
{
QString strall;
QFile readfile(filename);
if(readfile.open(QIODevice::ReadOnly))
{
QTextStream stream(&readfile);
strall=stream.readAll();
}
readfile.close();
DeleteOneline(nNumLine, strall);
QFile writefile(filename);
if(writefile.open(QIODevice::WriteOnly))
{
QTextStream wrtstream(&writefile);
wrtstream<<strall;
}
writefile.close();
}
void Delaytxt(QString &filename)
{
QString strall;
QFile readfile(filename);
if(readfile.open(QIODevice::ReadOnly))
{
QTextStream stream(&readfile);
strall=stream.readAll();
}
readfile.close();
if(strall.length()<3)
readfile.remove();
}
void Replease(QString &strall)
{
int nLine=0;
int Index=0;
//算出行数nLine
while(Index!=-1)
{
Index=strall.indexOf('\n',Index+1);
nLine++;
}
int idx=0;
strall.replace(0,1,"0");
if(nLine>2)
{
for(int i=0;i<nLine-2;i++)
{
idx=strall.indexOf("\n",idx+1);
strall.replace(idx+1,1,"0");
}
}
}
void RepleaseInFile(QString &filename)
{
QString strall;
QFile readfile(filename);
if(readfile.open(QIODevice::ReadOnly))
{
QTextStream stream(&readfile);
strall=stream.readAll();
}
readfile.close();
Replease(strall);
QFile writefile(filename);
if(writefile.open(QIODevice::WriteOnly))
{
QTextStream wrtstream(&writefile);
wrtstream<<strall;
}
writefile.close();
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QString curDir = ("d:/CATL-CIML-01/Desktop/nail0409/images/train/pinhole");
QString curDirtxt = ("d:/CATL-CIML-01/Desktop/nail0409/labels/train");
QString savetxt=("d:/CATL-CIML-01/Desktop/nail0409/labels/train/pinhole");
QFileInfoList imglist,txtlist;
QDir dir = curDir;
QDir dirtxt = curDirtxt;
QFileInfoList infoList = dir.entryInfoList(QDir::Files);
QFileInfoList infoListtxt = dirtxt.entryInfoList(QDir::Files);
QFileInfo info;
QFileInfo infotxt;
for (int i = 0; i < infoList.count(); i++)
{
info = infoList.at(i);
imglist.append(info);
for(int j=0;j < infoListtxt.count();j++)
{
infotxt = infoListtxt.at(j);
if(infotxt.baseName()==info.baseName())
{
txtlist.append(infotxt);
QString filetxtpath=curDirtxt;
filetxtpath+="/";
filetxtpath+=infotxt.baseName();
filetxtpath+=".txt";
QString target=savetxt;
target+="/";
target+=infotxt.baseName();
target+=".txt";
QFile::copy(filetxtpath,target);//文本拷贝
deleteOnelineInFile(0,target);//删除文本第0行,可以删除任意行,通过参数
Delaytxt(target);//删除一定条件比如大小为0或者内容为0文本
RepleaseInFile(target);//替换文本中的字符根据条件
}
}
}
return a.exec();
}