Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Zahlen spliten.

0 views
Skip to first unread message

Njipwo Nguenda

unread,
Aug 21, 2006, 4:16:01 AM8/21/06
to
Hallo Zusammen,

ich habe folgende Zahlen in einem File und will dieser File spliten. Der
File hat folgende Zahlen z.B.:

912;872;832;792;752;712;672;632;592;552;512;472;432;392;352;312;272;232;192;152;112;
80;83;115;155;195;235;275;315;355;395;435;475;515;555;595;635;675;715;755;795;835

Mit folgenden Zeile kann man die Zahlen einlesen und spliten.

m_strReader = new StreamReader(
m_OpenFileDialog.FileName);
string m_strText = m_strReader.ReadToEnd();

m_strText = m_strText.Replace("\r\n", "");
m_strReader.Close();

m_strValuesRead = m_strText.Split(new char[] {';'});

Wie kann ich nicht nur das Zeichen ';' als Splitszeichen betrachten, sondern
auch die Zeichenskombination aus ';' und '*' oder '_' usw...? (siehe
folgender File)
z.B. Wenn ich folgender File hätte:

912_872;832;792*752;712;672*632;592;552*512;472;432;392;352;312;272;232;192;152;112;
80;83*115;155;195;235;275*315;355;395;435;475;515;555;595;635*675;715;755;795;_835

Was ich hier gern hätte,wäre das Spliten alle Zahlen wie fogende:

912
872
832
792
752
......
755
795
835

Besten Dank.

Thomas Scheidegger [MVP]

unread,
Aug 21, 2006, 4:38:20 AM8/21/06
to
Hallo Njipwo


> 912_872;832;792*752;712;672*632;592;552*512;472;432;392;352;312;272;232;192;152;112;
> 80;83*115;155;195;235;275*315;355;395;435;475;515;555;595;635*675;715;755;795;_835
> Was ich hier gern hätte,wäre das Spliten alle Zahlen wie fogende:
> 912 872 832


könnte man vermutlich auch mit Regex o.ä. hinkriegen.....

Nur, unter der Voraussetzung
dass es sich um eine (grosse) simple & fehlerfreie ASCII-Datei mit (hier positiven) Zahlen handelt,
die man als Integer-Werte weiterverarbeiten will, könnte man auch direkt
eine Hi-Performance/Low-Level-Routine nutzen wie zB grob:


// ----------------------------
static void DoReadIntegers()
{
byte[] buf = new byte[64*1024];
using( FileStream fs = new FileStream( @"c:\TestInts.txt",
FileMode.Open, FileAccess.Read, FileShare.Read ) )
{
int read = 0;
int number = 0;
bool num = false;
int chr = 0x20;
do
{
read = fs.Read( buf, 0, buf.Length );
for( int i = 0; i < read; i++ )
{
chr = buf[i];
if( ( chr >= 0x30 ) && ( chr <= 0x39 ) ) // digits
{
number = ( number * 10 ) + ( chr & 0x0f );
num = true;
}
else // separators
{
if( num )
{
num = false;
Console.Write( "{0}, ", number );
number = 0;
}
}
}
}
while( read > 0 );

if( num ) // last number was not delimited?
{
Console.WriteLine( "{0}", number );
}
}
}
// ----------------------------

--
Thomas Scheidegger - MVP .NET - 'NETMaster'
http://www.cetus-links.org/oo_dotnet.html - http://dnetmaster.net/


Lars Steinmetz

unread,
Aug 21, 2006, 4:45:23 AM8/21/06
to
Njipwo Nguenda schrieb:
> ... m_strText ...

BTW: So sollten Bezeichner eingentlich nicht benannt werden.

=> Keine Prefixe!


> Wie kann ich nicht nur das Zeichen ';' als Splitszeichen betrachten, sondern
> auch die Zeichenskombination aus ';' und '*' oder '_' usw...? (siehe
> folgender File)
> z.B. Wenn ich folgender File hätte:
>
> 912_872;832;792*752;712;672*632;592;552*512;472;432;392;352;312;272;232;192;152;112;
> 80;83*115;155;195;235;275*315;355;395;435;475;515;555;595;635*675;715;755;795;_835
>


Entweder vor dem Splitten die alternativen Trennzeichen durch ein
einheitliches ersetzen:
text = text.Replace("_", ";");
text = text.Replace("*", ";");
...
string[] numberTexts = text.Split(new char[] {';'});

Oder, besser: Benutze Regex:


string text =
"912_872;832;792*752;712;672*632;592;552*512;472;432;392;352;312;272;232;192;152;112;80;83*115;155;195;235;275*315;355;395;435;475;515;555;595;635*675;715;755;795;_835";
Regex re = new Regex(@"[\;_\*]");
string[] matches = re.Split(text);
foreach (string match in matches)
Console.WriteLine(match);


Gruß Lars


Daniel Kuppitz

unread,
Aug 21, 2006, 5:05:02 AM8/21/06
to
Hallo Njipwo,

Regex regex = new Regex(@"\d+", RegexOptions.Compiled |
RegexOptions.Multiline);
List<int> numberList = new List<int>();
string fileContent;

using (StreamReader reader = new StreamReader(m_OpenFileDialog.FileName))
{
fileContent = reader.ReadToEnd();
}

foreach (Match m in regex.Matches(fileContent))
{
numberList.Add(int.Parse(m.Value));
}

int[] numbers = numberList.ToArray();

--
MfG,
Daniel Kuppitz

André Pönisch

unread,
Aug 21, 2006, 5:27:02 AM8/21/06
to
Hallo,

> Entweder vor dem Splitten die alternativen Trennzeichen durch ein
> einheitliches ersetzen:
> text = text.Replace("_", ";");
> text = text.Replace("*", ";");
> ...
> string[] numberTexts = text.Split(new char[] {';'});

Warum eigentlich nicht einfach so?

string[] numberTexts = text.Split(new char[] {';', '_', '*'});

Grüße
André

Frank Dzaebel

unread,
Aug 21, 2006, 6:03:03 AM8/21/06
to
Hallo Lars,

// ================
zum Thema Splitten ...

hier fiel mir bei ein paar Lösungen im Thread auf, dass noch
der StreamReader benutzt wird. Unter .NET 2.0 gibt es einfacher:

string inhalt = File.ReadAllText(@"C:\DateiPfad.txt", Encoding.Default);


Lars: > text = text.Replace("_", ";");
Lars: > text = text.Replace("*", ";");

Einfacher:
string[] splitted = text.Split(';' , '_' , '*');

Die Regex ist aber am flexibelsten.


// ========================
zum Thema: Ungarische Notation:

> > ... m_strText ...
> BTW: So sollten Bezeichner eingentlich nicht benannt werden.
> => Keine Prefixe!

Zwar benenne ich auch nicht mit Ungarischer Notation,
aber offiziell ist es erlaubt, wenn es sich nicht
um öffentliche APIs handelt. Etwas detaillierter dazu:

In einem Gespräch (vom 14.8.2006) mit Brad Abrams und
Krzysztof Cwalina wurde auf meine Fragen
folgendermassen beantwortet:

Dzaebel:
... concerning the naming of WinForm controls like
TextBox or ComboBox. Of course we know your
guidelines for hungarian notation.
I see many people using sth. like:
txbData, or cboData
Should we respect this because its going to be
more and more used? Or do i have to say "No,
do not use hungarian notation" (without exception),
if I interpret your guideline right?

Brad Abrams [MS Lead Program Manager, CLR Team]:
Yea, this comes up a lot... The offical guidelines
only apply to public apis...

Krzysztof Cwalina [MS Program Manager .NET Framework Team]:
Yes, we try not to get into the business of defining
guidelines for non-public visible identifiers. There is
just too much personal taste involved here and the
consistency argument is not as strong.

Dzaebel:
So naming for non-public visible identifiers is ~absolutely~
not restricted?
Ok say, not to use 'hungarian notation' is a only a 'suggested'
recommendation?

Krzysztof Cwalina [MS]:
Yes, but keep in mind that non-publicly visible
is more than just public. For example protected and
protected internal members are considered
publicly visible. Local variables, private, and internal
identifiers are not publicly visible.


ciao Frank
--
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET

Thomas Scheidegger [MVP]

unread,
Aug 21, 2006, 6:26:01 AM8/21/06
to
Hallo Frank


> Dzaebel:
> So naming for non-public visible identifiers is ~absolutely~ not restricted?
> Ok say, not to use 'hungarian notation' is a only a 'suggested' recommendation?
> Krzysztof Cwalina [MS]:

> Yes, ....Local variables, private, and internal identifiers are not publicly visible.


man beachte dabei aber,
diese Guidelines wären so eher ausgelegt für in sich _abgeschlossene_ Libraries (bzw gar mit sealed classes) .

Insbesondere bei Open Source - Libraries
sowie im Hinblick auf allgemeine _Verständlichkeit_ von fremdem Source
(Examples aus Web/Büchern, 'Arbeitsplatzwechsel', usw)
ist eine strikte Befolgung etwa der Microsoft-internen Richtlinien
http://blogs.msdn.com/brada/articles/361363.aspx
äusserst dringend anzuraten....

Man sollte sich also bei jedem Projekt zuvor im klaren sein,
wer alles den geschriebenen Source-Code jemals zu Gesicht bekommt.
Bleibt der Source auf ewig im selben kleinen Team,
kann man eine eigenwillige Interpretation von Naming Guides evtl. noch dulden...
Aber man gewöhnt sich so an etwas, das evtl. beim nächsten 'Arbeitgeber'
sehr schlecht ankommt.
Daher bleibt als einziger/sicherer gemeinsamer Nenner obige MS-Richtlinie.

Frank Dzaebel

unread,
Aug 21, 2006, 7:08:58 AM8/21/06
to
Hallo Thomas,

> ist eine strikte Befolgung etwa der Microsoft-internen Richtlinien
> http://blogs.msdn.com/brada/articles/361363.aspx
> äusserst dringend anzuraten....

Von meiner Seite aus so: "es sollte eine starke Tendenz dahin sein.".
Manchmal sprechen Firmen-Richtlinien o. "wichtige" Gründe
dagegen (auch diese sollten zumindest reflektiert werden).
Ich selber vermeide Ungarische Notation sogar bei
Membervariablen. Ein ziemlich simpler Grund, Ungarische
Notation nicht zu benutzen ist auch:
- wenn man eh auf öffentlicher Ebene keine ungarische
Notation nutzen darf, ist es ja praktisch, diese auch für
seine internen Naming Conventions zu benutzen.
Das wäre passend zum Design von C#: lean & clean.

Offiziell aber nur:
"... suggested recommended not to use hungarian
notation for 'non-public visible identifiers'.
...We [MS] try not to get into the business of defining
guidelines for non-public visible identifiers. (There is


just too much personal taste involved here and the

consistency argument is not as strong.)

Andreas Mueller

unread,
Aug 22, 2006, 9:47:55 AM8/22/06
to
André Pönisch wrote:


Und die leeren Einträge im array wird man so los:
string[] numberTexts =
text.Split(new char[] {';', '_', '*'},
StringSplitOptions.RemoveEmptyEntries);

HTH,
Andy
--
You can email me directly by removing the NOSPAm below
xmenNO...@gmxNOSPAm.netNOSPAm

0 new messages