需要把一個文本檔案做一個處理。
檔案檔案內是逐行的ip地址記錄,需要對IP地址按照科室進行歸類, 現在知道各科室的網段,例如:1---10是技術部。 11---20是財務部,
如何實作對文本檔案內的IP進行歸類呢??
TXT中有一欄位有IP地址例如 ,192.168.0.1 。。。。,
不同IP地址段對應不同的部門,例如 192.168.0.1---192.168.0.10 是 技術部門,11---20是財務,等等,,
用如何寫代碼實作,匯入的IP地址的TXT檔案,生成一個表,讓各IP地址對應的記錄,后面能歸屬到不同的部門
即 、、: 192.168.0.1 技術部門
uj5u.com熱心網友回復:
1. 檔案的格式是什么,有沒有其它欄位?2. 各科室的網段資料存放在什么地方?
uj5u.com熱心網友回復:
讀出來就是處理字串撒uj5u.com熱心網友回復:
估計你的難點是知道個IP如192.168.0.10,想要取出的是點后面的那個10吧。String ls_Str, ls_Tmp, ls_StrTmp
Int li_i
ls_Str = '192.168.0.10'
ls_StrTmp = ls_Str
DO UNTIL ls_Tmp = '.'
li_i ++
ls_Tmp = Right(ls_Str, 1 )
ls_Str = Left(ls_Str, Len(ls_Str) - 1)
LOOP
ls_Str = Right(ls_StrTmp, li_i - 1)
MessageBox('',ls_Str)
如上,從'192.168.0.10'中取出10后,再對比下部門的范圍。歸類即可
uj5u.com熱心網友回復:
沒必要用回圈吧?
string ls_ip,ls_sub
ls_ip = "192.168.0.10"
ls_sub = mid(ls_ip,LastPos(ls_ip,".") + 1)
uj5u.com熱心網友回復:
沒有什么好辦法打開檔案,按行讀取
uj5u.com熱心網友回復:
多謝,以前還真沒注意過這個函式。
uj5u.com熱心網友回復:
假設檔案(ipadd.txt)內容如下:"col1" "col2" "ipaddr" "col3"
1 2 "192.168.0.1" 3
4 5 "192.168.0.10" 6
7 8 "192.168.0.20" 9
資料庫中創建兩個表,ip_table保存各個IP段對應的部門,tb保存文本檔案處理后的結果
create table ip_table(ip_b varchar(15),ip_e varchar(15),dept varchar(20))
go
create table tb(ipaddr varchar(15),dept varchar(20))
go
--生成部分測驗資料
insert into ip_table
select '192.168.0.1','192.168.0.10','技術部門'
union select '192.168.0.11','192.168.0.20','財務'
go
新建一個外部資料源的資料視窗,d_test,結構如下:
col1 long
col2 long
ipaddr string(15)
col3 long
新建一個視窗,添加一個資料視窗控制元件dw_1,dw_1.dataobject = "d_test"
添加一個按鈕cb_1,用于讀取檔案ipadd.txt的內容,結果存放在資料視窗中,clicked()事件代碼如下:
dw_1.importfile("ipadd.txt",2)//由于首行為列名,所以從第二行開始讀取再加一個按鈕cb_2,將dw_1中的資料進行分析并保存到資料庫中,clicked事件代碼如下
long ll_row
string ls_ip,ls_sub,ls_dept
for ll_row = 1 to dw_1.RowCount()
ls_ip = dw_1.GetItemString(ll_row,"ipaddr") //取IP地址
ls_sub = mid(ls_ip,LastPos(ls_ip,".") + 1)
select dept into :ls_dept from ip_table where :ls_sub between cast(reverse(left(reverse(ip_b),charindex('.',reverse(ip_b))-1)) as int) and cast(reverse(left(reverse(ip_e),charindex('.',reverse(ip_e))-1)) as int); //查詢該地址所在部門
insert into tb(ipaddr,dept) values(:ls_ip,:ls_dept); //保存結果
if sqlca.sqlcode = 0 then //錯誤處理
commit;
elseif sqlca.sqlcode = - 1 then
MessageBox("Caption",sqlca.sqlerrtext,StopSign!)
rollback;
end if
next
點擊cb_1后就會把檔案的內容讀取到資料視窗中,再點擊cb_2即可把結果保存到tb表中.
uj5u.com熱心網友回復:
在資料庫中建一個表 c_ip,欄位為ip varchar(100)
先直接匯入到資料庫中,這一步應該比較簡單吧 importfile即可
或者在PB中的資料視窗中可以直接匯入(import data)
然后給c_ip加個欄位dept_nam
然后建一個資料視窗,把資料檢索出來,然后回圈處理即可
uj5u.com熱心網友回復:
使用 plsql dev ,把text的資料賦值進去 ,然后在update 就可以了uj5u.com熱心網友回復:
如果直接把檔案內容匯入到資料庫中,直接處理就行了.create table ip_table(ip_b varchar(15),ip_e varchar(15),dept varchar(20)) --部門的ip地址段
go
create table tb(ipaddr varchar(15),dept varchar(20)) --每個ip地址所對應的部門
go
create table ip_txt(ipaddr varchar(15)) --從檔案匯入的ip地址
go
--生成部分測驗資料
insert into ip_table --ip地址段對應的部門
select '192.168.0.1','192.168.0.10','技術部門'
union select '192.168.0.11','192.168.0.20','財務'
insert into ip_txt --匯入的ip地址
select '192.168.0.1'
union select '192.168.0.10'
union select '192.168.0.20'
go
select * from ip_txt
select * from ip_table
--保存處理結果
insert into tb(ipaddr,dept)
select ipaddr,dept
from ip_txt,ip_table
where cast(reverse(left(reverse(ipaddr),charindex('.',reverse(ipaddr))-1)) as int) between cast(reverse(left(reverse(ip_b),charindex('.',reverse(ip_b))-1)) as int) and cast(reverse(left(reverse(ip_e),charindex('.',reverse(ip_e))-1)) as int);
select * from tb
go
drop table ip_table,tb,ip_txt
go
--結果
(所影響的行數為 2 行)
(所影響的行數為 3 行)
ipaddr
---------------
192.168.0.1
192.168.0.10
192.168.0.20
(所影響的行數為 3 行)
ip_b ip_e dept
--------------- --------------- --------------------
192.168.0.1 192.168.0.10 技術部門
192.168.0.11 192.168.0.20 財務
(所影響的行數為 2 行)
(所影響的行數為 3 行)
ipaddr dept
--------------- --------------------
192.168.0.1 技術部門
192.168.0.10 技術部門
192.168.0.20 財務
(所影響的行數為 3 行)
uj5u.com熱心網友回復:
--或者直接將資料匯入到tb表中,再更新其內容.
create table ip_table(ip_b varchar(15),ip_e varchar(15),dept varchar(20)) --部門的ip地址段
go
create table tb(ipaddr varchar(15),dept varchar(20) null) --每個ip地址所對應的部門
go
--生成部分測驗資料
insert into ip_table --ip地址段對應的部門
select '192.168.0.1','192.168.0.10','技術部門'
union select '192.168.0.11','192.168.0.20','財務'
insert into tb(ipaddr) --匯入的ip地址
select '192.168.0.1'
union select '192.168.0.10'
union select '192.168.0.20'
go
select * from ip_table
select * from tb
--保存處理結果
update tb
set dept=ip_table.dept
from ip_table
where cast(reverse(left(reverse(ipaddr),charindex('.',reverse(ipaddr))-1)) as int) between cast(reverse(left(reverse(ip_b),charindex('.',reverse(ip_b))-1)) as int) and cast(reverse(left(reverse(ip_e),charindex('.',reverse(ip_e))-1)) as int);
select * from tb
go
drop table ip_table,tb
go
--結果
ip_b ip_e dept
--------------- --------------- --------------------
192.168.0.1 192.168.0.10 技術部門
192.168.0.11 192.168.0.20 財務
(所影響的行數為 2 行)
ipaddr dept
--------------- --------------------
192.168.0.1 NULL
192.168.0.10 NULL
192.168.0.20 NULL
(所影響的行數為 3 行)
(所影響的行數為 3 行)
ipaddr dept
--------------- --------------------
192.168.0.1 技術部門
192.168.0.10 技術部門
192.168.0.20 財務
(所影響的行數為 3 行)
uj5u.com熱心網友回復:
這個更簡潔易懂一些
--使用ip_txt臨時存放資料(對應于10樓的方法)
insert into tb(ipaddr,dept)
select ipaddr,dept
from ip_txt,ip_table
where cast(right(ipaddr,charindex('.',reverse(ipaddr))-1) as int) between cast(right(ip_b,charindex('.',reverse(ip_b))-1) as int) and cast(right(ip_e,charindex('.',reverse(ip_e))-1) as int);
--直接放進目的表(對應于11樓的方法)
update tb
set dept=ip_table.dept
from ip_table
where cast(right(ipaddr,charindex('.',reverse(ipaddr))-1) as int) between cast(right(ip_b,charindex('.',reverse(ip_b))-1) as int) and cast(right(ip_e,charindex('.',reverse(ip_e))-1) as int);
uj5u.com熱心網友回復:
NND,什么世道
uj5u.com熱心網友回復:
你在私信中提到:
--這個方式適用于存在多個IP段的情況,給你個在資料庫端的實作方法,你只需要把資料預先匯入資料庫中即可.
create table ip_table(ip_b varchar(15),ip_e varchar(15),dept varchar(20)) --部門的ip地址段
go
create table tb(ipaddr varchar(15),dept varchar(20) null) --每個ip地址所對應的部門
go
--使用函式,將IP地址格式每個段統一為3位(前面補0)
create function f_formatIP(@ip varchar(15))
returns varchar(15)
as
begin
declare @str varchar(15),@i int
set @i=0
set @str=''
while(@i<3)
begin
set @i=@i+1
set @str=@str+right('000'+left(@ip,charindex('.',@ip)-1),3)+'.'
set @ip=right(@ip,len(@ip)-charindex('.',@ip))
end
set @str=@str+right('000'+@ip,3)
return @str
end
go
--生成部分測驗資料
insert into ip_table --ip地址段對應的部門
select '192.168.0.1','192.168.0.10','技術部門'
union select '192.168.0.11','192.168.0.20','財務'
union select '192.168.1.20','192.168.1.30','董事會'
insert into tb(ipaddr) --匯入的ip地址
select '192.168.0.1'
union select '192.168.0.10'
union select '192.168.0.20'
union select '192.168.1.20'
union select '192.168.1.22'
go
select * from ip_table
select * from tb
go
--保存處理結果
update tb
set dept=ip_table.dept
from ip_table
where dbo.f_formatIP(ipaddr) between dbo.f_formatIP(ip_b) and dbo.f_formatIP(ip_e);
go
select * from tb
go
drop function f_formatIP
go
drop table ip_table,tb
go
--結果
ip_b ip_e dept
--------------- --------------- --------------------
192.168.0.1 192.168.0.10 技術部門
192.168.0.11 192.168.0.20 財務
192.168.1.20 192.168.1.30 董事會
(所影響的行數為 3 行)
ipaddr dept
--------------- --------------------
192.168.0.1 NULL
192.168.0.10 NULL
192.168.0.20 NULL
192.168.1.20 NULL
192.168.1.22 NULL
(所影響的行數為 5 行)
(所影響的行數為 5 行)
ipaddr dept
--------------- --------------------
192.168.0.1 技術部門
192.168.0.10 技術部門
192.168.0.20 財務
192.168.1.20 董事會
192.168.1.22 董事會
(所影響的行數為 5 行)
uj5u.com熱心網友回復:
大概是一個字串和檔案的操作吧。演算法大概就是
按行讀取檔案的字串。
根據特點加入不同的IP型別組中。
各位高手都寫的很具體了。
uj5u.com熱心網友回復:
還沒結uj5u.com熱心網友回復:
答案拿走了轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/94922.html
標籤:腳本語言
上一篇:提示錯誤,大家幫忙看看!
下一篇:PB mle控制元件
