文件读写问题,非常急~````(100分)

  • 主题发起人 主题发起人 flashwolf
  • 开始时间 开始时间
F

flashwolf

Unregistered / Unconfirmed
GUEST, unregistred user!
[:(][:(]现有一堆*.txt的文件,里面存放的是股票交易日线数据。
基本格式如:

日期,开盘,最高,最低,收盘,成交额,成交量
20010206,13.000,14.800,12.900,14.700,740736000.00,53616900
20010207,14.080,14.450,13.850,14.060,206500000.00,14596900
20010208,14.000,14.310,13.900,14.140,95937000.00,6790800
.....

现在要把它们的:开盘,最高,最低,收盘读出来存放到一个sql server数据库中,应该怎么做?
我用AssignFile(F, Strings);
Readln(F, FirstLine); 来读,但是字串中间的逗号怎样来区分?还有怎么样才能把整个文件的每行数据都读出来?
 
也是个数据库.用ado和odbc 都可以,也可以用Access转换。
 
>>字串中间的逗号怎样来区分
TStringList.CommaText is OK!

var
msl:TStringList;
i:Integer;
begin
msl:=TStringList.Create;
msl.CommaText:='20010206,13.000,14.800,12.900,14.700,740736000.00,53616900';
for i:=0 to msl.Count-1 do
Caption:=Caption+' '+msl;
end;
 
用比较笨的方法, 一个一个字读,发现是“,”是,dataIndex+1
If dataIndex=1 then 日期=StrTodate(),Else If DataIndex=2 Then....

如果发现是 Chr(13)____回车,那么 INc(Line) .------->既跳到下一个记录
(是很笨啊)
*****************************
记得我在学 FoxPro的时候,FP支持一个格式的数据输入,就是两个数据之间用
空格隔开,分别对应不同的数据段,而且FOXPRO中默认的是每行算一个记录
所以呢,你可以把 “,” 替换成 “ ”,然后借助FOXPRO(EXCEL也成)进行转化
,而且FOXPRO也支持 SQL SERVER。。。。。。。。
 
在creation-zy兄弟的基础下修改:
var
tmp,msl:TStringList;
i,j:Integer;
begin
msl:=TStringList.Create;
tmp:=TStringList.Create;
msl.LoadFromFile('*.txt');
for j:=0 to msl.Count-1 do
begin
tmp.CommaText:=msl.Strings[j];
for i:=0 to tmp.Count-1 do
//insert to table.
end;
end;
 
可以用sql Server 提供的Bcp外部命令即可
 
每一行的记录是固定的,这样逗号也是固定的(逗号的个数也是定的)可以这样读取:
procedure ProcGetStr(Str);
begin
//处理
end;

procedure ReadLine(Str: string)
var
I, J: Integer;
tmpStr: string;
begin
for I := 0 to 5 do
begin
J := Pos(Str, ',');
tmpStr := Copy(Str, 1, J);
ProcGetStr(Str);
Delete(Str, 1,I);
end;
end;
 
用,分隔的文本文件可以当成数据表用tquery读取,
第一行要加上字段名。
 
对每一个文件进行处理,读入内存中进行处理比较快;然后,对文件的每一行进行处理。
procedure ReadFileToMem(FName: string);
var
FList: TStringList;
begin
FList := TStringList.Create;
FList.LoadFormFile(FName);
{
以下进行每一行的处理。
for I := 0 to FList.Count -1 do
begin
Str := FList.Strings;
DealLine(Str);//可以见上面的函数。
end

}

end;

 
提一个思路,把文件改成Excel文件,然后通过Excel倒入到SQLServer中。
把*。txt改成*。xls即可。
 
每一行处理如下,对文件进行循环读取即可
procedure GetValue(Value:string);
var iResult,iPosion :integer;
TempStr :string;
begin
Val(Value, iResult, iPosion);
if iPosion=0 then
begin
Memo1.Lines.Add(Value);
exit;
end
else
begin
TempStr :=copy(Value,0,iPosion-1);
Memo1.Lines.Add(TempStr);
TempStr :=copy(Value,iPosion+1,length(Value)-iPosion-1);
GetValue(TempStr);
end;
end;
 
一行处理如下,对文件进行循环读取即可
procedure GetValue(Value:string);
var iResult,iPosion :integer;
TempStr :string;
begin
iPosion:=Pos(',',Value);
if iPosion=0 then
begin
Memo1.Lines.Add(Value);
exit;
end
else
begin
TempStr :=copy(Value,0,iPosion-1);
Memo1.Lines.Add(TempStr);
TempStr :=copy(Value,iPosion+1,length(Value)-iPosion);
GetValue(TempStr);
end;
end;
 
根本就用不着自己写代码了。
先用ACCESS把文件导入,然后再用SQL SERVER的导入工具导入ACCESS数据库!
或许可以用SQL SERVER的导入工具直接导入吧,但我没试成功。
 
在这先向楼上各位兄弟说声谢谢!谢谢你们的建议!
另外:
我直接把文件存成CSV格式后,用sql的DTS导入导出功能可以把内容导入了,但感觉还是
比较麻烦,因为.txt的文件有1000多个,(全是票交易日线数据,文件名如:0001.txt
0002.txt 600332.txt.....)如果一个一个导入的话会被累死啊[:(]。另外,
还要把第一行的内容去了"第一行的内容就是'日期,开盘,最高,最低,收盘,成交额,成交量
'。还有,最后形成
的SQL库中只要保留开盘,最高,最低,收盘,另外还要加上一个字段,那就是股票代码(即
*.txt中的*的内容,如600332)。所以现在还是有点晕,不知有什么办法最便捷?
 
那你可以通过ODBC建一个TXT的数据库,来SQL导入到你的表中嘛
 
xiaoywh:那不是也要一个文件一个文件的选?
 
还有,怎么样对文件进行循环读取?[?]
 
这些文件的格式都一样的吧?也就是说,都是导入一张表里的。
那就先合并成几个大文件后再导入吧。
 
有1000多个呀。
 
我还是偏向xiaoywh的办法,在DELPHI中编程实现,现在是这样:
procedure TForm1.Button3Click(Sender: TObject);
var
I: integer;
F: TextFile;
FirstLine: string;
openprice, hightest: string;
begin
OpenDialog1.Options := [ofAllowMultiSelect, ofFileMustExist];
OpenDialog1.Filter := 'Text files (*.txt)|*.txt|All files (*.*)|*.*';
OpenDialog1.FilterIndex := 2; { start the dialog showing all files }
if OpenDialog1.Execute then
with OpenDialog1.Files do
for I := 0 to Count - 1 do
begin
AssignFile(F, Strings); { next file in Files property }
Reset(F);
Readln(F, firstline);
getvalue(firstline);
CloseFile(F);
end;
end;
这样只能读出一行的,怎么样判断整个文件读取完毕(循环读取每一行文件)???
 

Similar threads

回复
0
查看
815
不得闲
回复
0
查看
867
不得闲
回复
0
查看
1K
不得闲
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
后退
顶部