怎么格式化这样的文本文件?(100分)

  • 主题发起人 主题发起人 maysoft
  • 开始时间 开始时间
M

maysoft

Unregistered / Unconfirmed
GUEST, unregistred user!
有一个文本文件格式是这样的!
每一行的内容分为三段。

前面是员工编号,中间是姓名,后面跟员工内部代码。
如:
126700024647 郭德芳 0113150
126700030711 王炜周 0115400
126700034642 刘宗仁 0088744
2304012601100132549 彭真才 0065565
2304012601100132425 陈元清 0061815
126700006259 欧阳迎春 0127153
…… …… ……


需要注意的是员工编号的长度不一致,内部代码长度一致。姓名长度当然也不一致了。那么怎么将内容格式化成如下的正确样式:

126700024647 郭德芳 0113150
126700030711 王炜周 0115400
126700034642 刘仁 0088744
2304012601100132549 彭真才 0065565
2304012601100132425 陈元清 0061815
126700006259欧阳迎春0127153
…… …… ……

员工编号长度最长位19位,姓名最长为4个汉字,内部编码最长为7位。我现在的难度如下:
由于员工编码长度一致,那么怎么让他们看起来是右对齐的?员工编码和内部编码之间长度为4个汉字的长度,如上面最后一个记录,如果名字是3个汉字或2个汉字,那么名字就要在员工编码和内部编码之间居中显示,怎么办啊?
 
去数据库里导一下 就可以了,没必要程序操作的

要不发过来 我给你导一下
 
每行字符串总长和每个位置的最大字符长度都有了,不够的地方补空格,自己写算法吧
不会很难的
 
//写个函数
procedure FormatData(InFile, OutFile: TFileName);
const
LEN1 = 19;
LEN2 = 8;
LEN3 = 7;
var
i: integer;
List: TStrings;
s,s1,s2,s3, sFormat: string;
begin
sFormat:= '%' + IntToStr(LEN1) + 's %' + IntToStr(LEN2) + 's %' + IntToStr(LEN3) + 's';
List:= TStringList.Create;
try
List.LoadFromFile(InFile);
for i:= 0 to List.Count - 1 do
begin
s:= Trim(List.Strings);
while Pos(' ',s)>0 do Delete(s,Pos(' ',s),1);
s1:= Copy(s, 1, Pos(' ',s)-1);
Delete(s,1,length(s1)+1);
s2:= Copy(s, 1, Pos(' ',s)-1);
Delete(s,1,length(s2)+1);
s3:= s;
while length(s2)<LEN2-1 do s2:= ' ' + s2 + ' '; //姓名居中
List.Strings:= Format(sFormat,[s1,s2,s3]);
end;
List.SaveToFile(OutFile);
finally
List.Free;
end;
end;
//调用如下:
procedure TForm1.Button1Click(Sender: TObject);
begin
FormatData('c:/mydata.txt','c:/mydata2.txt');
end;
 
to zylsoft 没有数据库,只有文本文件
原始文件下载地址:http://www.lxls.net/123.txt
正确的文件下载地址:http://www.lxls.net/正式.txt
 
to djrj,
我格式化后发现名字是4个字的前面和后面都有一个空格。但是我需要4个字的名字时前面和后面都没有空格。换句话说员工编码和内部编码间的长度始终固定在四个汉字的长度
 
这个问题很简单的,
QQ:372199229
 
有空格时trim掉就可以了
 
那就只要把
sFormat:= '%' + IntToStr(LEN1) + 's %' + IntToStr(LEN2) + 's %' + IntToStr(LEN3) + 's';
改成下面这个就可以
sFormat:= '%' + IntToStr(LEN1) + 's%' + IntToStr(LEN2) + 's%' + IntToStr(LEN3) + 's';
 
to djrj
我不想格式化文本文件的第一行和最后一行怎么办?
 
djrj已经写的很清楚了
你用case 判断就行啊
case length(s2) of
2:s2:= ' ' + s2 + ' ';
6:s2:= ' ' + s2 + ' ';
8:s2:=s2;
end;
 
to:文生,这个问题确实不难,可否把你的贴上来,好也让偶这小鸟学学啊,不要弄个QQ嘛
 
呵呵,我现在整天和文本处理打交道,不过你的方式不太适合我
 
方法简单一点说就是,取内容补空格
 
不想格式化第一行和最后一行就改一句改为for i:= 1 to List.Count - 2 do 就行了啊,看来真的要自已多想想啊,已经算是完全现存的了,这个问题我的回答就此打住了,
 
to djrj, 感激涕零!!!谢谢了!
 
刚才试了一下
是sFormat:= '%' + IntToStr(LEN1) + 's %' + IntToStr(LEN2) + 's %' + IntToStr(LEN3) + 's';这个问题
把's %'改成 's%'就可以了

procedure FormatData(InFile, OutFile: TFileName);
const
LEN1 = 19;
LEN2 = 8;
LEN3 = 7;
var
i: integer;
List: TStrings;
s,s1,s2,s3, sFormat: string;
begin
sFormat:= '%' + IntToStr(LEN1) + 's%' + IntToStr(LEN2) + 's%' + IntToStr(LEN3) + 's';
List:= TStringList.Create;
try
List.LoadFromFile(InFile);
for i:= 0 to List.Count - 1 do
begin
s:= Trim(List.Strings);
while Pos(' ',s)>0 do Delete(s,Pos(' ',s),1);
s1:= Copy(s, 1, Pos(' ',s)-1);
Delete(s,1,length(s1)+1);
s2:= Copy(s, 1, Pos(' ',s)-1);
Delete(s,1,length(s2)+1);
s3:= s;
while length(s2)<LEN2-1 do s2:= ' ' + s2 + ' '; //姓名居中
List.Strings:= Format(sFormat,[s1,s2,s3]);
end;
List.SaveToFile(OutFile);
finally
List.Free;
end;
end;
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
618
import
I
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部