如何使用文本文件的内容(制表符分隔格式)重命名文件夹中的文件?
How to use the contents of a text file(tab delimited format) to rename files in a folder?
我正在尝试制作电子证书以分发我的一项大学活动。我使用 Photoshop 生成了具有不同名称和卷号的批次证书。现在文件被命名为 core_01Data Set 1.jpg, core_02Data Set 2.jpg, 等等. 为了在线分发它们,它们需要根据参与者的名字进行重命名和排序。
我有一个 .txt 文件,其中包含参与者姓名、他们的卷号和大学名称(以制表符分隔格式)。我需要根据 .txt 文件的内容重命名文件。我已经尽力了,但没能走多远。请帮忙
#include<stdio.h>
#include<dirent.h>
int main()
{
FILE *fp;
char arr[3][20][40];
int i=0;
char final_name[19][50]={0};
fp = fopen("./new/core.txt", "r");
while(fgetc(fp)!=EOF)
{
while(fgetc(fp)!='\n' && i<20)
{
fscanf(fp,"%s%s%s", arr[0][i], arr[1][i], arr[2][i]);
i++;
}
}
i=1;
while(i<20)
{
strcat(final_name[i-1], arr[0][i]);
strcat(final_name[i-1], "_");
strcat(final_name[i-1], arr[1][i]);
strcat(final_name[i-1], "_");
strcat(final_name[i-1], arr[2][i]);
printf("%s\n", final_name[i-1]);
i++;
}
char name[19][50]={0};
char buf[19][50]={0};
for(i=1; i<20; i++)
{
if(i<10)
{
sprintf(buf[i-1], "core_0%d_Data Set %d", i, i);
}
else
{
sprintf(buf[i-1], "core_%d_Data Set %d", i, i);
}
printf("%s...\n", buf[i-1]);
name[i-1]=buf[i-1];
}
i=0;
DIR *d;
struct dirent *dir;
d = opendir("./new/");
if (d)
{
while ((dir = readdir(d)) != NULL )
{
printf("%s\n", dir->d_name);
if (strcmp(dir->d_name, buf[i]) == 0)
{
rename(dir->d_name, final_name[i]);
i++;
}
}
closedir(d);
}
}
LINK 到文件:https://goo.gl/S6B3AB
只是为了让您了解您做错了什么,请参阅下面的代码
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdbool.h>
#include <string.h>
int main(int argc, char **argv)
{
FILE *fp;
char arr[3][20][40];
int i=0;
int numberOfNames = 0;
fp = fopen("a.txt", "r");
// read until fscanf can get 3 items from file considering tabs as space between strings
while((fscanf(fp,"%s\t%s\t%s", arr[0][numberOfNames], arr[1][numberOfNames], arr[2][numberOfNames]) == 3) && (numberOfNames<20))
{
printf("%s %s %s\n", arr[0][numberOfNames], arr[1][numberOfNames], arr[2][numberOfNames]);
numberOfNames++;
}
// this init only the first string with null termination
char final_name[20][50]={0};
//This init the whole matrix
memset(final_name, 0, 1000);
i=0;
while(i<numberOfNames)
{
strcat(final_name[i], arr[0][i]);
strcat(final_name[i], "_");
strcat(final_name[i], arr[1][i]);
strcat(final_name[i], "_");
strcat(final_name[i], arr[2][i]);
printf("%s\n", final_name[i]);
i++;
}
char name[19][50]={0};
char buf[19][50]={0};
for(i=1; i<=numberOfNames; i++)
{
// Using %02d format you grants that the output is always with 2 digit at least and padded with 0
sprintf(buf[i-1], "core_%02d_Data Set %d", i, i);
printf("%s...\n", buf[i-1]);
// sprintf is the way to copy a string into another string
// You cannot simply name[i-1]=buf[i-1];
sprintf(name[i-1],buf[i-1]);
printf("%s\n", buf[i-1]);
}
}
如果需要可以使用python
#!/usr/bin/python
import string,os
f=open("in.txt")
a=f.readlines();
for x in a:
x=x[:-1]
r=string.split(x,",")
os.rename(r[0],r[1])
如果需要,您可以使用 powershell。我认为这会起作用。
$names = (gc core.txt)
$idx = 1
gci core*.jpg | %{
$newname = $names[$idx++].trim().split("`t")[0] + ".jpg"
ren $_ $newname
}
编辑:就是这个
.trim().split("`t")[0]
在制表符上拆分 core.txt 的每一行的部分和 returns 第一个元素。如果您还想包括其他列,请尝试以下操作:
$names = (gc core.txt)
$idx = 1
gci core*.jpg | %{
$newname = ($names[$idx++].trim() -replace "`t+","-") + ".jpg"
ren $_ $newname
}
我正在尝试制作电子证书以分发我的一项大学活动。我使用 Photoshop 生成了具有不同名称和卷号的批次证书。现在文件被命名为 core_01Data Set 1.jpg, core_02Data Set 2.jpg, 等等. 为了在线分发它们,它们需要根据参与者的名字进行重命名和排序。 我有一个 .txt 文件,其中包含参与者姓名、他们的卷号和大学名称(以制表符分隔格式)。我需要根据 .txt 文件的内容重命名文件。我已经尽力了,但没能走多远。请帮忙
#include<stdio.h>
#include<dirent.h>
int main()
{
FILE *fp;
char arr[3][20][40];
int i=0;
char final_name[19][50]={0};
fp = fopen("./new/core.txt", "r");
while(fgetc(fp)!=EOF)
{
while(fgetc(fp)!='\n' && i<20)
{
fscanf(fp,"%s%s%s", arr[0][i], arr[1][i], arr[2][i]);
i++;
}
}
i=1;
while(i<20)
{
strcat(final_name[i-1], arr[0][i]);
strcat(final_name[i-1], "_");
strcat(final_name[i-1], arr[1][i]);
strcat(final_name[i-1], "_");
strcat(final_name[i-1], arr[2][i]);
printf("%s\n", final_name[i-1]);
i++;
}
char name[19][50]={0};
char buf[19][50]={0};
for(i=1; i<20; i++)
{
if(i<10)
{
sprintf(buf[i-1], "core_0%d_Data Set %d", i, i);
}
else
{
sprintf(buf[i-1], "core_%d_Data Set %d", i, i);
}
printf("%s...\n", buf[i-1]);
name[i-1]=buf[i-1];
}
i=0;
DIR *d;
struct dirent *dir;
d = opendir("./new/");
if (d)
{
while ((dir = readdir(d)) != NULL )
{
printf("%s\n", dir->d_name);
if (strcmp(dir->d_name, buf[i]) == 0)
{
rename(dir->d_name, final_name[i]);
i++;
}
}
closedir(d);
}
}
LINK 到文件:https://goo.gl/S6B3AB
只是为了让您了解您做错了什么,请参阅下面的代码
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdbool.h>
#include <string.h>
int main(int argc, char **argv)
{
FILE *fp;
char arr[3][20][40];
int i=0;
int numberOfNames = 0;
fp = fopen("a.txt", "r");
// read until fscanf can get 3 items from file considering tabs as space between strings
while((fscanf(fp,"%s\t%s\t%s", arr[0][numberOfNames], arr[1][numberOfNames], arr[2][numberOfNames]) == 3) && (numberOfNames<20))
{
printf("%s %s %s\n", arr[0][numberOfNames], arr[1][numberOfNames], arr[2][numberOfNames]);
numberOfNames++;
}
// this init only the first string with null termination
char final_name[20][50]={0};
//This init the whole matrix
memset(final_name, 0, 1000);
i=0;
while(i<numberOfNames)
{
strcat(final_name[i], arr[0][i]);
strcat(final_name[i], "_");
strcat(final_name[i], arr[1][i]);
strcat(final_name[i], "_");
strcat(final_name[i], arr[2][i]);
printf("%s\n", final_name[i]);
i++;
}
char name[19][50]={0};
char buf[19][50]={0};
for(i=1; i<=numberOfNames; i++)
{
// Using %02d format you grants that the output is always with 2 digit at least and padded with 0
sprintf(buf[i-1], "core_%02d_Data Set %d", i, i);
printf("%s...\n", buf[i-1]);
// sprintf is the way to copy a string into another string
// You cannot simply name[i-1]=buf[i-1];
sprintf(name[i-1],buf[i-1]);
printf("%s\n", buf[i-1]);
}
}
如果需要可以使用python
#!/usr/bin/python
import string,os
f=open("in.txt")
a=f.readlines();
for x in a:
x=x[:-1]
r=string.split(x,",")
os.rename(r[0],r[1])
如果需要,您可以使用 powershell。我认为这会起作用。
$names = (gc core.txt)
$idx = 1
gci core*.jpg | %{
$newname = $names[$idx++].trim().split("`t")[0] + ".jpg"
ren $_ $newname
}
编辑:就是这个
.trim().split("`t")[0]
在制表符上拆分 core.txt 的每一行的部分和 returns 第一个元素。如果您还想包括其他列,请尝试以下操作:
$names = (gc core.txt)
$idx = 1
gci core*.jpg | %{
$newname = ($names[$idx++].trim() -replace "`t+","-") + ".jpg"
ren $_ $newname
}