怎么取出字符串到数组中.

qianduo 2007-03-27 05:44:23
例从一个文本文件中一行一行读出数据,然后保存到table中.
AAA,BBB,CCC,DDD
01234,ABC,"AA,BB",ABC
在第二行时怎么取出""里面的内容为一个字符串.
以前是用string.split(",")取出来是变成五个字段了.
...全文
548 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
journeyboy 2007-03-30
  • 打赏
  • 举报
回复
你问到:
--------------------------------------------------
Re:现在还有一个小的问题..

123,AAA,,qwe,
这样的话只会有三列,而不是四列,第三列为空
http://community.csdn.net/Expert/topic/5423/5....
--------------------------------------------------

你的问题不是一个小问题,这涉及到前导符的使用。

经过测试,使用如下模式可以解决问题:
([\w ]+)|(("[\w, ]+"[\w ]*)+)|((?<=,)(?=,))|(^(?=,))|((?<=,)$)

其中关键点如下:
"((?<=,)(?=,))" 匹配 ",,"
"(^(?=,))" 匹配 行首的","
"((?<=,)$)" 匹配 行尾的","

对于如下字符串(不知道是否能够涵盖你的全部格式):
,,"123","456""789",,,"12,9",123,,"111"adf"22" "333",,

匹配结果如下:

<空白>
<空白>
"123"
"456""789"
<空白>
<空白>
"12,9"
123
<空白>
"111"adf"22" "333"
<空白>
<空白>
vinsonhwj 2007-03-29
  • 打赏
  • 举报
回复
关于00123变为123的问题,其实你用双引号就可以解决了"00123",处理方法有点似Excel
qianduo 2007-03-29
  • 打赏
  • 举报
回复
to journeyboy(IT民工)

Thank you very much..
journeyboy 2007-03-28
  • 打赏
  • 举报
回复
TO:qianduo(flyinsky)

你问到:
------------------------------
“123”,”456””789”
123是第一列 456”789 是第二列

那怎么用正则表达式
------------------------------

这种情况下,就不是你主贴所问的格式了。
不过,正则表达式仍然能够搞定,请看:

使用如下匹配格式:
([\w ]+)|(("[\w, ]+"[\w ]*)+)

(("[\w, ]+"[\w ]*)+) 用来匹配下列格式
"12,9"
"456""789"
"111"adf"22" "333"

对于下面字符串,够复杂了吧?
"123","456""789","12,9","111"adf"22" "333"

匹配结果:
"123"
"456""789"
"12,9"
"111"adf"22" "333"

不知是否满足楼主要求?
qianduo 2007-03-28
  • 打赏
  • 举报
回复
to vinsonhwj() &showname()

用ODBC这类方法时,第一行是为要为空.
还有就是当字符串为00123的时候,显示的是123
qianduo 2007-03-28
  • 打赏
  • 举报
回复
to journeyboy(IT民工)

例:
“123”,”456””789”
123是第一列 456”789 是第二列

那怎么用正则表达式
neil_cn 2007-03-27
  • 打赏
  • 举报
回复
Public Class Form1

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim strSrc As String = "01234,ABC," + Chr(34) + "AA,BB" + Chr(34) + ",ABC"

Dim strMid As String() = strSrc.Split(Chr(34))
Dim nLoop As Integer = 0
Dim nTotal As Integer = strMid.Length

Dim strTmp As String(), strLast As String()
Dim nLastLen = 0
While (nLoop < nTotal)
ReDim strTmp(0)
If ((nLoop + 1) Mod 2) Then
strTmp = strMid(nLoop).Split(",")
Else
strTmp(0) = strMid(nLoop)
End If

ReDim Preserve strLast(nLastLen + strTmp.Length - 1)
Array.Copy(strTmp, 0, strLast, nLastLen, strTmp.Length)

nLastLen = strLast.Length
nLoop = nLoop + 1
End While

nLoop = 0
nTotal = strLast.Length
While (nLoop < nTotal)
If (strLast(nLoop).Length) Then
Debug.WriteLine(strLast(nLoop))
End If
nLoop = nLoop + 1
End While
End Sub
End Class

没考虑引号不匹配的情况,一个思路而已
vinsonhwj 2007-03-27
  • 打赏
  • 举报
回复
AAA,BBB,CCC,DDD
01234,ABC,"AA,BB",ABC
其实上面这种以逗号为分隔的文本格式,是一种CSV文件格式来的。
读取CSV格式的代码如下:
不过需要注意的地方就是原文本格式应为:
----------------------------------
[空行]
AAA,BBB,CCC,DDD
01234,ABC,"AA,BB",ABC
----------------------------------
Public Function GetDataSetFromCSV(ByVal filePath As String, ByVal fileName As String) As DataSet
Dim strConn As String = "Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq="
strConn += filePath 'filePath, For example: C:\
strConn += ";Extensions=asc,csv,tab,txt;"
Dim objConn As OdbcConnection = New OdbcConnection(strConn)
Dim dsCSV As DataSet = New DataSet
Try
Dim strSql As String = "select * from " + fileName 'fileName, For example: 1.csv
Dim odbcCSVDataAdapter As OdbcDataAdapter = New OdbcDataAdapter(strSql, objConn)
odbcCSVDataAdapter.Fill(dsCSV)
Return dsCSV
Catch ex As Exception
Throw ex
End Try
End Function

sanniko 2007-03-27
  • 打赏
  • 举报
回复
1、取出第一个 “ 的位置
2、取出最后一个”的位置
3、 用String.Substring
journeyboy 2007-03-27
  • 打赏
  • 举报
回复
事到如今,也只好使用正则表达式了。

代码如下:

Dim rxg As New System.Text.RegularExpressions.Regex("((""[\w, ]+"")|([\w ]+))")
Dim ResultCollection As System.Text.RegularExpressions.MatchCollection = _
rxg.Matches("""AA, BB, c"", 01234,ABC,""AA,BB"",ABC ,x ,""A, BB""")

For Each MatchResult As System.Text.RegularExpressions.Match In ResultCollection
Debug.WriteLine(MatchResult.Groups(0).ToString())
Next

解释如下:

对于这样的复杂字符串:
"AA, BB, c", 01234,ABC,"AA,BB",ABC ,x ,"A, BB"

根据其特点,要么是不含","的字符串,要么是可能包含","的被引号包围的字符串,
使用如下模式匹配:
(("[\w, ]+")|([\w ]+))

得到如下结果,每个结果分一行:
"AA, BB, c"
01234
ABC
"AA,BB"
ABC
x
"A, BB"

不知是否满足楼主需求?
snto 2007-03-27
  • 打赏
  • 举报
回复
貌似没有好办法,建议你更换分隔字符串:

AAA,BBB,CCC,DDD
01234,ABC,"AA|BB",ABC

要不你就挨行的搜索,找到‘"’字符的时候做一次技术处理,记录位置1,找到第二个‘"’的时候,记录位置2,然后用substring之类的函数截取,像楼主的例子从string.substring(0,8)string.substring(11,15)string.substring(18,20)具体代码写起来应该不难
showname 2007-03-27
  • 打赏
  • 举报
回复
我也在研究这个问题 请先看代码,我的C盘有一个文件ipinfor.dat文件,是由QQ的IP数据库里解压出来的
里面的纪录结构是“192.168.100.100(空格)255.255.255.100(空格)广东省广州市” .(15个字符,(空格),15个字符,(空格)) 大概有26万条条纪录左右,我想实现的目的是将这26万条纪录使用insert into语句导入到SQLexpress2005中,但在执行do..loop 循环时,总是提示错误"将截断字符串或二进制数据。语句已终止。"根本没办法一次通过,且每次都是只可成功导入前110条纪录(因数据表没有设主键)试了三次,数据库共有330条纪录,都有重复》》》》》我想知道出现这问题的原因是什么?求神叼叼你。。
Imports system.data
Imports System.Data.SqlClient

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
If Me.TextBox1.Text = "" Then MsgBox("请先选择源数据") : Exit Sub
Dim strcon As String = "Data Source=PC1\sqlexpress;Initial Catalog=mydatabase2005;Integrated Security=True"
Dim mycon As New SqlConnection(strcon)
mycon.Open()
Dim mycom As New SqlCommand
Dim strsql As String
'<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Dim filenum As Integer = FreeFile()
Dim temp, ip, iparea, place As String
FileOpen(filenum, Ofd.FileName, OpenMode.Input)
'开始读取行
Me.Label1.Text = 0
Do While Not EOF(filenum)
temp = LineInput(filenum)
If Trim(temp) = "" Then GoTo jumpline
ip = "'" & temp.Substring(0, 15) & "'"
iparea = "'" & temp.Substring(16, 15) & "'"
place = "'" & temp.Remove(0, 31) & "'"
strsql = "insert into ipinfor ( ip , iparea ,place ) values ( " & ip & " , " & iparea & " , " & place & " )"
mycom.Connection = mycon
mycom.CommandText = strsql
mycom.ExecuteNonQuery()



Loop
FileClose(filenum)
''>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
jumpline: '显示数据
strsql = "select * from ipinfor"
Dim myadapter As New SqlDataAdapter(strsql, mycon)
Dim mydataset As New DataSet
myadapter.Fill(mydataset, "mytable")
Me.DataGridView1.DataSource = mydataset.Tables("mytable")
mycon.Close() REM 关闭连接
End Sub

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧