473,385 Members | 1,846 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,385 software developers and data experts.

A nice way to use regex for complicate parsing


My goal is to write a parser for these imaginary string from the SMTP
protocol, regarding RFC 821 and 1869.
I'm a little flexible with the BNF from these RFC :-)
Any comment ?

tests=[ 'MAIL FROM:<jo********@address.com>',
'MAIL FROM:jo********@address.com',
'MAIL FROM:<jo********@address.comSIZE=1234
OT*******@bar.com',
'MAIL FROM:jo********@address.com SIZE=1234
OT*******@bar.com',
'MAIL FROM:<"th**@is.alegal=email"@address.com>',
'MAIL FROM:"th**@is.alegal=email"@address.com',
'MAIL FROM:<"th**@is.alegal=email"@address.comSIZE=1234
OT*******@bar.com',
'MAIL FROM:"th**@is.alegal=email"@address.com SIZE=1234
OT*******@bar.com',
]

def RN(name, regex):
"""protect using () and give an optional name to a regex"""
if name:
return r'(?P<%s>%s)' % (name, regex)
else:
return r'(?:%s)' % regex
regex={}

# <dotnum::= <snum"." <snum"." <snum"." <snum>
regex['dotnum']=RN(None, r'[012]?\d?\d\.[012]?\d?\d\.[012]?\d?\d\.
[012]?\d?\d' % regex)
# <dot-string::= <string| <string"." <dot-string>
regex['dot_string']=RN(None, r'[a-zA-Z0-9]+(?:\.[a-zA-Z0-9]+)*' %
regex)
# <domain::= <element| <element"." <domain>
regex['domain']=RN('domain', r'%(dotnum)s|%(dot_string)s' % regex)
# <q::= any one of the 128 ASCII characters except <CR>, <LF>, quote
("), or backslash (\)
regex['q']=RN(None, r'[^\n\r"\\]' % regex)
# <x::= any one of the 128 ASCII characters (no exceptions)
regex['x']=RN(None, r'.' % regex)
# <qtext::= "\" <x| "\" <x<qtext| <q| <q<qtext>
regex['qtext']=RN(None, r'(?:\\%(x)s|%(q)s)+' % regex)
# <quoted-string::= """ <qtext"""
regex['quoted_string']=RN('quoted_string', r'"%(qtext)s"' % regex)
# <local-part::= <dot-string| <quoted-string>
regex['local_part']=RN('local_part', r'%(quoted_string)s|%
(dot_string)s' % regex)
# <mailbox::= <local-part"@" <domain>
regex['mailbox']=RN('mailbox', r'%(local_part)s@%(domain)s' % regex)
# <path::= "<" [ <a-d-l":" ] <mailbox">"
# also accept address without <>
regex['path']=RN('path', r'(?P<path_lt><)?%(mailbox)s(?(path_lt)>)' %
regex)
# esmtp-keyword ::= (ALPHA / DIGIT) *(ALPHA / DIGIT / "-")
regex['esmtp_keyword']=RN(None, r'[a-zA-Z0-9][-a-zA-Z0-9]*' % regex)
# esmtp-value ::= 1*<any CHAR excluding "=", SP, and all ;
syntax and values depend on esmtp-keyword
# control characters (US ASCII 0-31inclusive)>
regex['esmtp_value']=RN(None, r'[^= \t\r\n\f\v]*' % regex)
# esmtp-parameter ::= esmtp-keyword ["=" esmtp-value]
regex['esmtp_parameter']=RN(None, r'%(esmtp_keyword)s(?:=%
(esmtp_value)s)?' % regex)
# esmtp-parameter ::= esmtp-keyword ["=" esmtp-value]
regex['esmtp_parameters']=RN('esmtp_parameters', r'%
(esmtp_parameter)s(?:\s+%(esmtp_parameter)s)+' % regex)
# esmtp-cmd ::= inner-esmtp-cmd [SP esmtp-parameters] CR LF
regex['esmtp_addr']=RN('esmtp_addr', r'%(path)s(?:\s+%
(esmtp_parameters)s)?' % regex)

for t in tests:
for keyword in [ 'MAIL FROM:', 'RCPT TO:' ]:
keylen=len(keyword)
if t[:keylen].upper()==keyword:
t=t[keylen:]
break

match=re.match(regex['esmtp_addr'], t)
if match:
print 'MATCH local_part=%(local_part)s domain=%(domain)s
esmtp_parameters=%(esmtp_parameters)s' % match.groupdict()
else:
print 'DONT match', t

Mar 29 '07 #1
3 2684
It would be worth learning pyparsing to do this.

aspineux wrote:
My goal is to write a parser for these imaginary string from the SMTP
protocol, regarding RFC 821 and 1869.
I'm a little flexible with the BNF from these RFC :-)
Any comment ?

tests=[ 'MAIL FROM:<jo********@address.com>',
'MAIL FROM:jo********@address.com',
'MAIL FROM:<jo********@address.comSIZE=1234
OT*******@bar.com',
'MAIL FROM:jo********@address.com SIZE=1234
OT*******@bar.com',
'MAIL FROM:<"th**@is.alegal=email"@address.com>',
'MAIL FROM:"th**@is.alegal=email"@address.com',
'MAIL FROM:<"th**@is.alegal=email"@address.comSIZE=1234
OT*******@bar.com',
'MAIL FROM:"th**@is.alegal=email"@address.com SIZE=1234
OT*******@bar.com',
]

def RN(name, regex):
"""protect using () and give an optional name to a regex"""
if name:
return r'(?P<%s>%s)' % (name, regex)
else:
return r'(?:%s)' % regex
regex={}

# <dotnum::= <snum"." <snum"." <snum"." <snum>
regex['dotnum']=RN(None, r'[012]?\d?\d\.[012]?\d?\d\.[012]?\d?\d\.
[012]?\d?\d' % regex)
# <dot-string::= <string| <string"." <dot-string>
regex['dot_string']=RN(None, r'[a-zA-Z0-9]+(?:\.[a-zA-Z0-9]+)*' %
regex)
# <domain::= <element| <element"." <domain>
regex['domain']=RN('domain', r'%(dotnum)s|%(dot_string)s' % regex)
# <q::= any one of the 128 ASCII characters except <CR>, <LF>, quote
("), or backslash (\)
regex['q']=RN(None, r'[^\n\r"\\]' % regex)
# <x::= any one of the 128 ASCII characters (no exceptions)
regex['x']=RN(None, r'.' % regex)
# <qtext::= "\" <x| "\" <x<qtext| <q| <q<qtext>
regex['qtext']=RN(None, r'(?:\\%(x)s|%(q)s)+' % regex)
# <quoted-string::= """ <qtext"""
regex['quoted_string']=RN('quoted_string', r'"%(qtext)s"' % regex)
# <local-part::= <dot-string| <quoted-string>
regex['local_part']=RN('local_part', r'%(quoted_string)s|%
(dot_string)s' % regex)
# <mailbox::= <local-part"@" <domain>
regex['mailbox']=RN('mailbox', r'%(local_part)s@%(domain)s' % regex)
# <path::= "<" [ <a-d-l":" ] <mailbox">"
# also accept address without <>
regex['path']=RN('path', r'(?P<path_lt><)?%(mailbox)s(?(path_lt)>)' %
regex)
# esmtp-keyword ::= (ALPHA / DIGIT) *(ALPHA / DIGIT / "-")
regex['esmtp_keyword']=RN(None, r'[a-zA-Z0-9][-a-zA-Z0-9]*' % regex)
# esmtp-value ::= 1*<any CHAR excluding "=", SP, and all ;
syntax and values depend on esmtp-keyword
# control characters (US ASCII 0-31inclusive)>
regex['esmtp_value']=RN(None, r'[^= \t\r\n\f\v]*' % regex)
# esmtp-parameter ::= esmtp-keyword ["=" esmtp-value]
regex['esmtp_parameter']=RN(None, r'%(esmtp_keyword)s(?:=%
(esmtp_value)s)?' % regex)
# esmtp-parameter ::= esmtp-keyword ["=" esmtp-value]
regex['esmtp_parameters']=RN('esmtp_parameters', r'%
(esmtp_parameter)s(?:\s+%(esmtp_parameter)s)+' % regex)
# esmtp-cmd ::= inner-esmtp-cmd [SP esmtp-parameters] CR LF
regex['esmtp_addr']=RN('esmtp_addr', r'%(path)s(?:\s+%
(esmtp_parameters)s)?' % regex)

for t in tests:
for keyword in [ 'MAIL FROM:', 'RCPT TO:' ]:
keylen=len(keyword)
if t[:keylen].upper()==keyword:
t=t[keylen:]
break

match=re.match(regex['esmtp_addr'], t)
if match:
print 'MATCH local_part=%(local_part)s domain=%(domain)s
esmtp_parameters=%(esmtp_parameters)s' % match.groupdict()
else:
print 'DONT match', t

--
Shane Geiger
IT Director
National Council on Economic Education
sg*****@ncee.net | 402-438-8958 | http://www.ncee.net

Leading the Campaign for Economic and Financial Literacy
Mar 29 '07 #2
On Mar 29, 9:42 am, Shane Geiger <sgei...@ncee.netwrote:
It would be worth learning pyparsing to do this.
Thanks to Shane and Steven for the ref to pyparsing. I also was
struck by this post, thinking "this is pyparsing written in re's and
dicts".

The approach you are taking is *very* much like the thought process I
went through when first implementing pyparsing. I wanted to easily
compose expressions from other expressions. In your case, you are
string interpolating using a cumulative dict of prior expressions.
Pyparsing uses various subclasses of the ParserElement class, with
operator definitions for alternation ("|" or "^" depending on non-
greedy vs. greedy), composition ("+"), and negation ("~"). Pyparsing
also uses its own extended results construct, ParseResults, which
supports named results fields, accessible using list indicies, dict
names, or instance names.

Here is the pyparsing treatment of your example (I may not have gotten
every part correct, but my point is more the similarity of our
approaches). Note the access to the smtp parameters via the Dict
transformer.

-- Paul
from pyparsing import *

# <dotnum::= <snum"." <snum"." <snum"." <snum>
intgr = Word(nums)
dotnum = Combine(intgr + "." + intgr + "." + intgr + "." + intgr)

# <dot-string::= <string| <string"." <dot-string>
string_ = Word(alphanums)
dotstring = Combine(delimitedList(string_,"."))

# <domain::= <element| <element"." <domain>
domain = dotnum | dotstring

# <q::= any one of the 128 ASCII characters except <CR>, <LF>, quote
("), or backslash (\)
# <x::= any one of the 128 ASCII characters (no exceptions)
# <qtext::= "\" <x| "\" <x<qtext| <q| <q<qtext>
# <quoted-string::= """ <qtext"""
quotedString = dblQuotedString # <- just use pre-defined expr from
pyparsing

# <local-part::= <dot-string| <quoted-string>
localpart = (dotstring | quotedString).setResultsName("localpart")

# <mailbox::= <local-part"@" <domain>
mailbox = Combine(localpart + "@" + domain).setResultsName("mailbox")

# <path::= "<" [ <a-d-l":" ] <mailbox">"
# also accept address without <>
path = "<" + mailbox + ">" | mailbox

# esmtp-keyword ::= (ALPHA / DIGIT) *(ALPHA / DIGIT / "-")
esmtpkeyword = Word(alphanums,alphanums+"-")

# esmtp-value ::= 1*<any CHAR excluding "=", SP, and all
esmtpvalue = Regex(r'[^= \t\r\n\f\v]*')

# ; syntax and values depend on esmtp-keyword
# control characters (US ASCII 0-31inclusive)>
# esmtp-parameter ::= esmtp-keyword ["=" esmtp-value]
# esmtp-parameter ::= esmtp-keyword ["=" esmtp-value]
esmtpparameters = Dict(
ZeroOrMore( Group(esmtpkeyword + Suppress("=") + esmtpvalue) ) )

# esmtp-cmd ::= inner-esmtp-cmd [SP esmtp-parameters] CR LF
esmtp_addr = path + \
Optional(esmtpparameters,default=[])\
.setResultsName("parameters")

for t in tests:
for keyword in [ 'MAIL FROM:', 'RCPT TO:' ]:
keylen=len(keyword)
if t[:keylen].upper()==keyword:
t=t[keylen:]
break

try:
match = esmtp_addr.parseString(t)
print 'MATCH'
print match.dump()
# some sample code to access elements of the parameters
"dict"
if "SIZE" in match.parameters:
print "SIZE is", match.parameters.SIZE
print
except ParseException,pe:
print 'DONT match', t

prints:
MATCH
['<', ['johnsmith@addresscom'], '>']
- mailbox: ['johnsmith@addresscom']
- localpart: johnsmith
- parameters: []

MATCH
[['johnsmith@addresscom']]
- mailbox: ['johnsmith@addresscom']
- localpart: johnsmith
- parameters: []

MATCH
['<', ['johnsmith@addresscom'], '>', ['SIZE', '1234'], ['OTHER',
'f**@bar.com']]
- OTHER: fo*@bar.com
- SIZE: 1234
- mailbox: ['johnsmith@addresscom']
- localpart: johnsmith
- parameters: [['SIZE', '1234'], ['OTHER', 'f**@bar.com']]
- OTHER: fo*@bar.com
- SIZE: 1234
SIZE is 1234

MATCH
[['johnsmith@addresscom'], ['SIZE', '1234'], ['OTHER', 'f**@bar.com']]
- OTHER: fo*@bar.com
- SIZE: 1234
- mailbox: ['johnsmith@addresscom']
- localpart: johnsmith
- parameters: [['SIZE', '1234'], ['OTHER', 'f**@bar.com']]
- OTHER: fo*@bar.com
- SIZE: 1234
SIZE is 1234

MATCH
['<', ['"to*@is.alegal=email"@addresscom'], '>']
- mailbox: ['"to*@is.alegal=email"@addresscom']
- localpart: "to*@is.alegal=email"
- parameters: []

MATCH
[['"to*@is.alegal=email"@addresscom']]
- mailbox: ['"to*@is.alegal=email"@addresscom']
- localpart: "to*@is.alegal=email"
- parameters: []

MATCH
['<', ['"to*@is.alegal=email"@addresscom'], '>', ['SIZE', '1234'],
['OTHER', 'f**@bar.com']]
- OTHER: fo*@bar.com
- SIZE: 1234
- mailbox: ['"to*@is.alegal=email"@addresscom']
- localpart: "to*@is.alegal=email"
- parameters: [['SIZE', '1234'], ['OTHER', 'f**@bar.com']]
- OTHER: fo*@bar.com
- SIZE: 1234
SIZE is 1234

MATCH
[['"to*@is.alegal=email"@addresscom'], ['SIZE', '1234'], ['OTHER',
'f**@bar.com']]
- OTHER: fo*@bar.com
- SIZE: 1234
- mailbox: ['"to*@is.alegal=email"@addresscom']
- localpart: "to*@is.alegal=email"
- parameters: [['SIZE', '1234'], ['OTHER', 'f**@bar.com']]
- OTHER: fo*@bar.com
- SIZE: 1234
SIZE is 1234

Mar 29 '07 #3
On 29 mar, 17:33, "Paul McGuire" <p...@austin.rr.comwrote:
On Mar 29, 9:42 am, Shane Geiger <sgei...@ncee.netwrote:
It would be worth learning pyparsing to do this.

Thanks to Shane and Steven for the ref to pyparsing. I also was
struck by this post, thinking "this is pyparsing written in re's and
dicts".
My first idea was : why learn a parsing library if I can do it using
're'
and dicts :-)
>
The approach you are taking is *very* much like the thought process I
went through when first implementing pyparsing. I wanted to easily
compose expressions from other expressions. In your case, you are
string interpolating using a cumulative dict of prior expressions.
Pyparsing uses various subclasses of the ParserElement class, with
operator definitions for alternation ("|" or "^" depending on non-
greedy vs. greedy), composition ("+"), and negation ("~"). Pyparsing
also uses its own extended results construct, ParseResults, which
supports named results fields, accessible using list indicies, dict
names, or instance names.

Here is the pyparsing treatment of your example (I may not have gotten
every part correct, but my point is more the similarity of our
approaches). Note the access to the smtp parameters via the Dict
transformer.

-- Paul
Thanks !

Any parsing library I used before were heavy to start with.
The benefit was inversely proportional to the size of the project.
Your look to be lighter, and the results are more easily usable.

Thanks for showing me your lib.

Anyway today I will keep my idea for small parsing.
Alain

>
from pyparsing import *

# <dotnum::= <snum"." <snum"." <snum"." <snum>
intgr = Word(nums)
dotnum = Combine(intgr + "." + intgr + "." + intgr + "." + intgr)

# <dot-string::= <string| <string"." <dot-string>
string_ = Word(alphanums)
dotstring = Combine(delimitedList(string_,"."))

# <domain::= <element| <element"." <domain>
domain = dotnum | dotstring

# <q::= any one of the 128 ASCII characters except <CR>, <LF>, quote
("), or backslash (\)
# <x::= any one of the 128 ASCII characters (no exceptions)
# <qtext::= "\" <x| "\" <x<qtext| <q| <q<qtext>
# <quoted-string::= """ <qtext"""
quotedString = dblQuotedString # <- just use pre-defined expr from
pyparsing

# <local-part::= <dot-string| <quoted-string>
localpart = (dotstring | quotedString).setResultsName("localpart")

# <mailbox::= <local-part"@" <domain>
mailbox = Combine(localpart + "@" + domain).setResultsName("mailbox")

# <path::= "<" [ <a-d-l":" ] <mailbox">"
# also accept address without <>
path = "<" + mailbox + ">" | mailbox

# esmtp-keyword ::= (ALPHA / DIGIT) *(ALPHA / DIGIT / "-")
esmtpkeyword = Word(alphanums,alphanums+"-")

# esmtp-value ::= 1*<any CHAR excluding "=", SP, and all
esmtpvalue = Regex(r'[^= \t\r\n\f\v]*')

# ; syntax and values depend on esmtp-keyword
# control characters (US ASCII 0-31inclusive)>
# esmtp-parameter ::= esmtp-keyword ["=" esmtp-value]
# esmtp-parameter ::= esmtp-keyword ["=" esmtp-value]
esmtpparameters = Dict(
ZeroOrMore( Group(esmtpkeyword + Suppress("=") + esmtpvalue) ) )

# esmtp-cmd ::= inner-esmtp-cmd [SP esmtp-parameters] CR LF
esmtp_addr = path + \
Optional(esmtpparameters,default=[])\
.setResultsName("parameters")

for t in tests:
for keyword in [ 'MAIL FROM:', 'RCPT TO:' ]:
keylen=len(keyword)
if t[:keylen].upper()==keyword:
t=t[keylen:]
break

try:
match = esmtp_addr.parseString(t)
print 'MATCH'
print match.dump()
# some sample code to access elements of the parameters
"dict"
if "SIZE" in match.parameters:
print "SIZE is", match.parameters.SIZE
print
except ParseException,pe:
print 'DONT match', t

prints:
MATCH
['<', ['johnsmith@addresscom'], '>']
- mailbox: ['johnsmith@addresscom']
- localpart: johnsmith
- parameters: []

MATCH
[['johnsmith@addresscom']]
- mailbox: ['johnsmith@addresscom']
- localpart: johnsmith
- parameters: []

MATCH
['<', ['johnsmith@addresscom'], '>', ['SIZE', '1234'], ['OTHER',
'...@bar.com']]
- OTHER: f...@bar.com
- SIZE: 1234
- mailbox: ['johnsmith@addresscom']
- localpart: johnsmith
- parameters: [['SIZE', '1234'], ['OTHER', '...@bar.com']]
- OTHER: f...@bar.com
- SIZE: 1234
SIZE is 1234

MATCH
[['johnsmith@addresscom'], ['SIZE', '1234'], ['OTHER', '...@bar.com']]
- OTHER: f...@bar.com
- SIZE: 1234
- mailbox: ['johnsmith@addresscom']
- localpart: johnsmith
- parameters: [['SIZE', '1234'], ['OTHER', '...@bar.com']]
- OTHER: f...@bar.com
- SIZE: 1234
SIZE is 1234

MATCH
['<', ['"t...@is.alegal=email"@addresscom'], '>']
- mailbox: ['"t...@is.alegal=email"@addresscom']
- localpart: "t...@is.alegal=email"
- parameters: []

MATCH
[['"t...@is.alegal=email"@addresscom']]
- mailbox: ['"t...@is.alegal=email"@addresscom']
- localpart: "t...@is.alegal=email"
- parameters: []

MATCH
['<', ['"t...@is.alegal=email"@addresscom'], '>', ['SIZE', '1234'],
['OTHER', '...@bar.com']]
- OTHER: f...@bar.com
- SIZE: 1234
- mailbox: ['"t...@is.alegal=email"@addresscom']
- localpart: "t...@is.alegal=email"
- parameters: [['SIZE', '1234'], ['OTHER', '...@bar.com']]
- OTHER: f...@bar.com
- SIZE: 1234
SIZE is 1234

MATCH
[['"t...@is.alegal=email"@addresscom'], ['SIZE', '1234'], ['OTHER',
'...@bar.com']]
- OTHER: f...@bar.com
- SIZE: 1234
- mailbox: ['"t...@is.alegal=email"@addresscom']
- localpart: "t...@is.alegal=email"
- parameters: [['SIZE', '1234'], ['OTHER', '...@bar.com']]
- OTHER: f...@bar.com
- SIZE: 1234
SIZE is 1234

Mar 30 '07 #4

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

3
by: Jon Maz | last post by:
Hi All, Am getting frustrated trying to port the following (pretty simple) function to CSharp. The problem is that I'm lousy at Regular Expressions.... //from...
3
by: Natalia DeBow | last post by:
Hi there, I have another question for .NET RegEx experts. I am reading in a C Sharp file line by line and I am trying to detect comments that start with either // of ///. What I am...
4
by: Brian Henry | last post by:
I have phone numbers like this in a data table 123-435-1234 1231231234 432.234.2321 they all have different formatting, what I want to do is get them all formatted like this (123) 123-1234
13
by: Chris Lieb | last post by:
I am trying to write a regex that will parse BBcode into HTML using JavaScript. Everything was going smoothly using the string class replace() operator with regex's until I got to the list tag....
24
by: cassetti | last post by:
Here's the issue: I have roughly 20 MS excel spreadsheets, each row contains a record. These records were hand entered by people in call centers. The problem is, there can and are duplicate...
17
by: Mark | last post by:
I must create a routine that finds tokens in small, arbitrary VB code snippets. For example, it might have to find all occurrences of {Formula} I was thinking that using regular expressions...
16
by: Mark Chambers | last post by:
Hi there, I'm seeking opinions on the use of regular expression searching. Is there general consensus on whether it's now a best practice to rely on this rather than rolling your own (string)...
4
by: CJ | last post by:
Is this the format to parse a string and return the value between the item? Regex pRE = new Regex("<File_Name>.*>(?<insideText>.*)</File_Name>"); I am trying to parse this string. ...
4
by: AMP | last post by:
Hello, I have a Regex: Regex regex = new Regex(@"22 22 22 22 22 22 22 22 22 22(? <centervalue>.+)33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33...
0
by: Faith0G | last post by:
I am starting a new it consulting business and it's been a while since I setup a new website. Is wordpress still the best web based software for hosting a 5 page website? The webpages will be...
0
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 3 Apr 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome former...
0
by: ryjfgjl | last post by:
In our work, we often need to import Excel data into databases (such as MySQL, SQL Server, Oracle) for data analysis and processing. Usually, we use database tools like Navicat or the Excel import...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: aa123db | last post by:
Variable and constants Use var or let for variables and const fror constants. Var foo ='bar'; Let foo ='bar';const baz ='bar'; Functions function $name$ ($parameters$) { } ...
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.