"0009|sssss|sfasfsd|fasdfsd|lll|fasfsd|........"取出"|"之间的字符的算法!(100分)

  • 主题发起人 meng9999
  • 开始时间
若是不想使用java固有的类,那么改写一下我的c程序即可.
若想使用java固有的类,则可以使用StringTokenizer类

StringTokenizer st = new StringTokenizer("0001|abcd|efgh|....", "|");
String[] ss = new String[st.countTokens+1];
int i = 0;
while (st.hasMoreTokens())
{
ss = st.nextToken();
i++;
}
return ss;
 
若是不想使用java固有的类,那么改写一下我的c程序即可.
若想使用java固有的类,则可以使用StringTokenizer类

StringTokenizer st = new StringTokenizer("0001|abcd|efgh|....", "|");
String[] ss = new String[st.countTokens+1];
int i = 0;
while (st.hasMoreTokens())
{
ss = st.nextToken();
i++;
}
return ss;
 
如果大家不骂我的话,我认为vfp做这种事最简单:
CStr='000|1111|2222|e|ffff|trfddddddd|sssssssssssssss|ttttttt|'
*注意最后的‘|’一定要有,不然是死循环,可以加上判断.
CStrLong=len(Cstr)&&得到字符串长度
do while CStrLong!=0
NStr=at('|',CStr)&&查找'|'在字符串cstr中第一次出现的位置
mystr=left(CStr,NStr-1)&&所求的字串
? mystr
CStr=right(Cstr,CstrLong-Nstr)&&原字串减去上次所求的字串+'|'
CstrLOng=Len(Cstr)
enddo
*我在vfp6下测试通过.大家不要骂我^_^.我知道很多会delphi的人认为vfp是垃圾.
 
以前我在一个银行里做的时候是用这种方法的;
它不需要网络字节的转换;
那时定是这样的"字符串长度|查余额|帐号|密码|....."
然后后台会完收到这个串,解析包;
其实在网络上发这种字符并不是最好的方案;
最好在c中用结构体来存放收到的包;在c中用结构体的地址和指针
就可以解决解包的过程;
 
我想以此来和大家一起学习网络编程!希望大家能把经验拿出来和大家一起分赏!
我所写的那个"534|sgdsfg|gsdf.."包就是在网络上传递的数据包!他们用的是
底层socket传数据;语言也就没什么关系了;现在用的是c和java;
它们相户用socket传数据;
 
没有人来玩了吗?不玩我就结账了!
 
pos和copy两个函数就可以搞定了
 
给你一个java的,java自带的有好多问题!!!!

public static String[] split( String splitStr,String mark )
{
if (splitStr == "" || mark == "") return null;
int len=1;
String tempStr=splitStr;
while (tempStr.indexOf(mark) != -1)
{
tempStr = tempStr.substring(tempStr.indexOf(mark) + mark.length());
len++;
}
String[] str=new String[len];
len=0;
while (splitStr.indexOf(mark) != -1)
{
str[len]=splitStr.substring(0, splitStr.indexOf(mark));
splitStr = splitStr.substring(splitStr.indexOf(mark) + mark.length());
len++;
}
if (splitStr != "") str[len]=splitStr;
return str;
}
 
procedure Extract(const Source: string; var Data; SplitterChar: Char = #9);
var
R: PString;
P, S: PChar;
begin
if Length(Source) = 0 then Exit;
R := @Data;
P := PChar(Source);
S := P;
while True do
begin
if P^ = SplitterChar then
begin
SetString(R^, S, P - S);
Inc(R);
S := P + 1;
end;
Inc(P);
if P^ = #0 then
begin
SetString(R^, S, P - S);;
break;
end;
end;
end;

type
TData = record
V1: string;
V2: string;
V3: string;
end;

var
S: string;
V1: TData;
V2: array [0..2] of string;
begin
S := 'Value1|Value2|Value3';
Extract(S, V1, '|');
Extract(S, V2, '|');
ShowMessage(V1.V1);
ShowMessage(V2[0]);
end;
 
2002年的帖子了,好像没有人关注了。[:D]

procedure TForm1.Button1Click(Sender: TObject);
var
str: String;
StrList: TStringList;
i: Integer;
begin
str := '0009|sssss|sfasfsd|fasdfsd|lll|fasfsd|ccc"';
StrList := TStringList.Create;
Str := StringReplace(Str, '|', #13#10, [rfReplaceAll]);
StrList.Text := Str;
for i := 0 to StrList.count - 1 do
ShowMessage(StrList);
StrList.Free;
end;
 
Dreamwaver MX里面的SQL语句就是这样生成的。
 
其实应该说来很简单,如果用C的话,也是用一个循环,
先保存起始字符指针,然后移动指针,看是不是所分隔的字符,如果是,有了起始指针,有了长度(当前指针 - 起始指针),则将值取出,将起始指针重新赋值,再循环。

一个循环搞定。
 
你们都想复杂了! 这样的格式,我想一定是数据库导出时生成的!
只需要为此文件建一个
Microsoft Text Driver (*.txt;*.csv) 类型的 ODBC 数据源,分隔符自定义为'|'
然后用 ADO 去联接它,和普通的数据库用起来一模一样!方便得很!

如果想导入 SQL 2000 就更容易!一句:
BULK INSERT DM.dbo.testest FROM 'F:/DM/DATA/其它文件/3.TXT'
WITH
(
FIELDTERMINATOR = '|',
ROWTERMINATOR = '/n'
)
 
顶部