首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

文本文件怎么导入到数据库

2012-03-28 
文本文件如何导入到数据库?文本说明:单据号(20)商品行数(4)客户名称(50)税号(15)地址(50)银行帐号(50)货物

文本文件如何导入到数据库?
文本说明:
单据号(20)   商品行数(4)   客户名称(50)   税号(15)   地址(50)   银行帐号(50)  
  货物名称(30)   计量单位(6)   规格(16)   数量(16.6)   金额(14.2)

文本内容:

单据号   商品行数   单位名称   税号   地址电话   银行帐号  
    财务软件   套   四模块   2   20000.00  
    财务软件   套   八模块   2   41000.00  
    软磁盘   盒   5 "   10     400.00
    软磁盘   盒   3.5 "   100   6000.00    
    硬磁盘   块   1G   1     1300.00  
如何读取出来,并填入到数据库?
求高手给预帮帮忙?

[解决办法]
1.读取该文本文件
2.依次保存记录到数据库(就不说了)

下面是以前写过的读取CSV类.可以读取换行过的记录,且对引号做过处理.


type
TCSVRead = class
private
FDataList: TList;
FCurrent: Integer;
function unUsualRow(sLine: string): boolean;
function LoadHead(stCSV: TStringList): boolean;
function GetData: TStringList;
function GetCount: Integer;
public
Head: TStringList;
property Data: TStringList read GetData;
property Count: integer read GetCount;
Constructor Create;
Destructor Destroy;override;
procedure LoadCSV(FileName: string);
function First: boolean;
function Next: boolean;
function Eof: Boolean;
end;


//实现
{ TCSVRead }

constructor TCSVRead.Create;
begin
FDataList := TList.Create;
Head := TStringList.Create;
end;

destructor TCSVRead.Destroy;
var
I: integer;
begin
if Assigned(Head) then
Head.Free;
for I := 0 to FDataList.Count - 1 do
TStringList(FDataList[I]).Free;
FDataList.Free;
inherited;
end;

function TCSVRead.Eof: Boolean;
begin
if FCurrent > = Count then
Result := true
else
Result := false;
end;

function TCSVRead.First: boolean;
begin
if Count > 0 then
FCurrent := 0;
Result := true;
end;

function TCSVRead.GetCount: Integer;
begin
Result := FDataList.Count;
end;

function TCSVRead.GetData: TStringList;
begin
try
if (FCurrent > = 0) and (FCurrent < Count) then
Result := FDataList[FCurrent]
else
Result := nil;
except
Result := nil;
end;
end;

procedure TCSVRead.LoadCSV(FileName: string);
var
stCSV: TStringList;
I,Index,Count: integer;
st: TstringList;
sLine: string;
LineEOF,bReadNext: boolean;
begin
if Trim(FileName) = ' ' then
raise SysUtils.Exception.Create( '请指定CSV文件 ');

try
FDataList.Clear;
FCurrent := -1;
try
stCSV := TStringList.Create;
stCSV.LoadFromFile(Filename);
except
//无法读取文件
end;
Count := stCSV.Count;
if Count > 1 then
LoadHead(stCSV);

I := 1;
while I < Count do begin
st := TstringList.Create;

LineEOF := false;
bReadNext := true;
sLine := stCSV[I];
while not LineEOF do begin
//判断本行格式是不是不正常
if unUsualRow(sLine) then
bReadNext := false;
if sLine[1] = ' " ' then begin
sLine := copy(sLine,2,length(sLine));
repeat begin
Index := pos( ' ", ',sLine);


if Index > 0 then begin // 找到 “, 说明字段为双引号引起来的,且是在中间的字段
st.Add(copy(sLine,1,Index - 1));
sLine := copy(sLine,Index + 2,Length(sLine));
break;
end
else begin //否则 直接 查看最后位是不是 "
if (sLine[Length(sLine)] = ' " ') then begin //是 “ 说明该字段是本行最后一个字段
st.Add(copy(sLine,1,Length(sLine) - 1));
LineEOF := true;
break;
end
else begin
if (not bReadNext) then begin //本行格式有错误,不再读取下面行,因为会影响后面读取数据
st.Add(copy(sLine,1,Length(sLine)));
LineEOF := true;
break;
end
else begin //存在换行符,要再读取下一行
Inc(I);
sLine := sLine + ' ' + stCSV[I];
end;
end;
end;
end;
until (false);
end
else begin
Index := pos( ', ',sLine);
if Index = 0 then begin
st.Add(copy(sLine,1,Length(sLine)));
LineEOF := true;
end
else begin
st.Add(copy(sLine,1,Index - 1));
sLine := copy(sLine,Index + 1,Length(sLine));
end;
end;
if Length(sLine) = 0 then begin //为空表示 最后的字段 值为 空
LineEOF := true;
st.Add( ' ');
end;
end;
inc(I);
FDataList.Add(st);
end;
First;
except
raise SysUtils.Exception.Create( 'CSV文件读取失败 ');
end;
stCSV.Free;
end;

function TCSVRead.LoadHead(stCSV: TStringList): boolean;
var
Index: integer;
sLine: string;
LineEOF: boolean;
begin
Head.Clear;
sLine := stCSV[0];
LineEOF := false;

while (not LineEOF) or (Length(sLine) = 0) do begin
Index := pos( ', ',sLine);
if Index = 0 then begin
Head.Add(copy(sLine,1,Length(sLine)));
LineEOF := true;
end
else begin
Head.Add(copy(sLine,1,Index - 1));
sLine := copy(sLine,Index + 1,Length(sLine));
end;
end;
Result := true;

end;

function TCSVRead.Next: boolean;
begin
Result := false;
if Count > 0 then begin
if FCurrent < Count then
inc(FCurrent);
Result := true;
end;
end;

function TCSVRead.unUsualRow(sLine: string): boolean;
var
Index1,Index2: integer;
begin
Result := false;
Index1 := pos( ' " ',sLine);
Index2 := pos( ' ", ',sLine);
if (Index2 > 0) and (Index2 <= Index1) then
Result := true;
end;

热点排行