C# how to split and get one specifiq answer line from adb - c#

my code
text = ExecADB(string_, "-s " + array[0] + "shell cat /proc/cpuinfo");
TracerWrite("Cpu: ", Color.White);
TracerWriteLine(text.Trim(), Color.SeaGreen);
this is full output
enter image description here
How to split just:
Hardware : Qualcomm Technologies, Inc MSM8937

As long as the substring you're looking for is always followed by a specific string (like the newline character or "Revision"), we can use IndexOf to get the starting index of a substring within a string (using "Hardware" as the start string to search for), and Substring to get the actual string. To get the length of the string we're looking for, we can get the index of the string we know always follows it and subtract that from our starting index:
var text = "CPU revision: 4\r\nHardware: Qualcomm Technologies\r\nRevision: 8300";
var hardware = string.Empty;
// Find the indices of the start and end of the string we want
var startOfString = "Hardware";
var endOfString = Environment.NewLine; // Or possibly "Revision"
var startIndex = text.IndexOf(startOfString);
if (startIndex > -1)
{
var endIndex = text.IndexOf(endOfString, startIndex + startOfString.Length);
if (endIndex < 0) hardware = text.Substring(startIndex);
else hardware = text.Substring(startIndex, endIndex - startIndex).TrimEnd();
}
// Output the string we were searching for
Console.WriteLine(hardware);
Console.Write("\n\nDone. Press any key to exit...");
Console.ReadKey();

Related

Given a string find occurrences and replace with another string without using string.replace()

Here is an example of what I want to implement: for instance, given the string Something, if you were to replace all occurrences of so with DDD, the result would be DDDmething.
Here is how I am implementing it; my code finds a char by its specific position and changes it, but in fact I want to implement what I stated above.
static void Main(string[] args)
{
string str = "The Haunting of Hill House!";
Console.WriteLine("String: " + str);
// replacing character at position 7
int pos = 7;
char rep = 'p';
string res = str.Substring(0, pos) + rep + str.Substring(pos + 1);
Console.WriteLine("String after replacing a character: " + result);
Console.ReadLine();
}
Alternative might be to split the string by "so" and join the resulting array by "DDD" :
string result = string.Join("DDD", "something".Split(new[] { "so" }, StringSplitOptions.None));
This should do what you want. The idea is to use IndexOf to find the index of the substring to replace then append the substring before it followed by the replacement, then start the search over from the end of the found substring. Then after all substrings are found and replaced append the rest of the original string to the end if there is any.
Note this doesn't do any checks on the input and you really should use the string.Replace as I'm sure it's more performant.
public string Replace(string input, string find, string replace)
{
// The current index in the string where we are searching from
int currIndex = 0;
// The index of the next substring to replace
int index = input.IndexOf(find);
// A string builder used to build the new string
var builder = new StringBuilder();
// Continue until the substring is not found
while(index != -1)
{
// If the current index is not equal to the substring location
// when we need to append everything from the current position
// to where we found the substring
if(index != currIndex )
{
builder.Append(input.Substring(currIndex , index - currIndex));
}
// Now append the replacement
builder.Append(replace);
// Move the current position past the found substring
currIndex = index + find.Length;
// Search for the next substring.
index = input.IndexOf(find, currIndex );
}
// If the current position is not the end of the string we need
// to append the remainder of the string.
if(currIndex < input.Length)
{
builder.Append(input.Substring(currIndex));
}
return builder.ToString();
}
You could do it like this:
var someString = "This is some sort of string.";
var resultIndex = 0;
var searchKey ="So";
var replacementString = "DDD";
while ((resultIndex = someString.IndexOf(searchKey, resultIndex, StringComparison.OrdinalIgnoreCase)) != -1)
{
var prefix = someString.Substring(0, Math.Max(0, resultIndex - 1));
var suffix = someString.Substring(resultIndex + searchKey.Length);
someString = prefix + replacementString + suffix;
resultIndex += searchKey.Length;
}
Expected to produce "This is DDDme DDDrt of string.".

How to read specific values in string?

For example, TOMILA RELEASE V6.24 , i want to get 6.24 i used
if (txt.Contains("<TOMILA RELEASE"))
{
int iStartIndex = txt.LastIndexOf("<TOMILA RELEASE") + 17;
for (int i = 0; i < 50; i++) {
if (txt[iStartIndex + i] == '>') break;
currentRelease += txt[iStartIndex + i];
}
}
So, my question is if i want to get the specific 6 from TOMILA RELEASE V6.24, how could i get it?
You can try LastIndexOf followed by Substring
var result = str.Substring(str.LastIndexOf('TOMILA RELEASE V') + 1);
If you want to take first number in the string you can use following regular expression.
string s = "TOMILA RELEASE V6.24";
string digit = Regex.Match(s, "\\d").Value;
Here \d is for matching the digit, you can find more about regular expression in this tutorial, The 30 Minute Regex Tutorial
If you want to extract all number before dot then you can add + with \d and use do to end the extraction.
string number = Regex.Match(s, "\\d+.").Value.Replace(".","");
If you want to get a specific portion of a string, you could use the below code
string str = "6.24";
var val = str.Substring(0, 1);

How can i parse text from string and add it to a List<string> using indexof and substring?

The code:
int index = 0;
List<string> Names = new List<string>();
while (index != -1)
{
string firstTag = "a title";
string endTag = "href";
string forums = webBrowser1.DocumentText;
index = forums.IndexOf(firstTag);
int index1 = forums.IndexOf(endTag, index);
string Count = forums.Substring(index + 9, ((index1 - 35) - index));
Names.Add(forumsCount);
}
In this case i want to use indexof and substring.
The way i did it now i'm getting endless loop and very large List Names and all the Names inside is the same one the index is never move forward.
Looks like you never move forward the starting point. You need to use IndexOf(String, Int32) when getting the first index and specify where to start the search, otherwise you'll just keep getting the same result.
Something like this:
const string openingTag = "a title=\"";
const string closingTag = "\" href";
var html = " sadsffdaf a title=\"מכבי תאמכ\" href, a title=\" תאמכ\" href, a title=\"מכבי \" href";
var names = new List<string>();
var index = 0;
var previousIndex = 0;
while (index > -1)
{
index = html.IndexOf(openingTag, previousIndex);
if (index == -1)
continue;
var secondIndex = html.IndexOf(closingTag, index);
var result = html.Substring(index + openingTag.Length, secondIndex - (index + openingTag.Length));
names.Add(result);
previousIndex = index + 1;
}
EDIT: I updated code to include an example HTML string I tested against as per your comment.
I also updated the substring to get the text between the two tags. I assume this is what you want to do?
Also, in your question you're taking the first index from 'nums' and the second tag from 'forums'. I'm guessing this was a typo?
I'm not sure I can help any further without seeing the actual HTML you are parsing.

SubString Text Selection

I'm using C#, and have the following string text value:
get directions from Sydney to Melbourne
And this is the code that I have at the moment to try and get the text that appears between From and To
String fromDestination = InputTextbox.Text;
if (fromDestination.Contains("from"))
{
fromDestination = fromDestination.Substring(fromDestination.IndexOf("from") + 5, fromDestination.IndexOf("to") - 3);
}
That code removes the word "from" from the returned value, but I cannot work out how to get ride of the "to". The output at the moment is:
sydney to Melb
Thanks for any help.
Here's another possible route (lolpun)..
You can split via "from" and "to". Each part is created for you then:
var str = "get directions from Sydney to Melbourne";
var parts = str.Split(new string[] { "from", "to" }, StringSplitOptions.None); // split it up
var from = parts[1]; // index 1 is from
var to = parts[2]; // index 2 is to
Console.WriteLine(from); // "Sydney"
Console.WriteLine(to); // "Melbourne"
The second parameter to pass to the Substring method is the number of chars to extract from the instance string, not another position
String fromDestination = InputTextbox.Text;
int pos = fromDestination.IndexOf(" from ");
if(pos >= 0)
{
int pos2 = fromDestination.IndexOf(" to ", pos);
if(pos2 > -1)
{
int len = pos2 - (pos + 6);
fromDestination = fromDestination.Substring(pos+6, len);
}
}
Notice that I have changed the search strings adding a space before and after from and to. This is a precautional measure required to avoid false positives when a city name contains 'to' as part of its name or if there is another from embedded in the text before the actual starting from
If the string is always the same I would suggest a simple string split.
string fromDestination = InputTextbox.Text.Split(' ')[3];
You can also use regular expressions:
String fromDestination = "get directions from Sydney to Melbourne";
var match = Regex.Match(fromDestination, #"(?<=from\s).*(?=\sto)");
if (match.Groups.Count > 0)
fromDestination = match.Groups[0].Value;
Substring(startIndex, length)
for compute the length you should try to fromDestination.Length - fromDestination.IndexOf(" to ")
fromDestination.Substring(fromDestination.IndexOf(" from ") + 5, fromDestination.Length - fromDestination.IndexOf(" to "));
This will get you the string "Sydney Melbourne":
string fromDestination = "get directions from Sydney to Melbourne";
string result = fromDestination.Substring(fromDestination.IndexOf("from") + 5).Replace("to", "");
By the look you probably would be better off replacing the textbox for 2 comboboxes,each with their items filled by a predefined list of available cities so the user cannot enter any typos for example and you just react to the selectedindex of the combobox...

c# getting a string within another string

i have a string like this:
some_string = "A simple demo of SMS text messaging.\r\n+CMGW: 3216\r\n\r\nOK\r\n\"
im coming from vb.net and i need to know in c#, if i know the position of CMGW, how do i get "3216" out of there?
i know that my start should be the position of CMGW + 6, but how do i make it stop as soon as it finds "\r" ??
again, my end result should be 3216
thank you!
Find the index of \r from the start of where you're interested in, and use the Substring overload which takes a length:
// Production code: add validation here.
// (Check for each index being -1, meaning "not found")
int cmgwIndex = text.IndexOf("CMGW: ");
// Just a helper variable; makes the code below slightly prettier
int startIndex = cmgwIndex + 6;
int crIndex = text.IndexOf("\r", startIndex);
string middlePart = text.Substring(startIndex, crIndex - startIndex);
If you know the position of 3216 then you can just do the following
string inner = some_string.SubString(positionOfCmgw+6,4);
This code will take the substring of some_string starting at the given position and only taking 4 characters.
If you want to be more general you could do the following
int start = positionOfCmgw+6;
int endIndex = some_string.IndexOf('\r', start);
int length = endIndex - start;
string inner = some_string.SubString(start, length);
One option would be to start from your known index and read characters until you hit a non-numeric value. Not the most robust solution, but it will work if you know your input's always going to look like this (i.e., no decimal points or other non-numeric characters within the numeric part of the string).
Something like this:
public static int GetNumberAtIndex(this string text, int index)
{
if (index < 0 || index >= text.Length)
throw new ArgumentOutOfRangeException("index");
var sb = new StringBuilder();
for (int i = index; i < text.Length; ++i)
{
char c = text[i];
if (!char.IsDigit(c))
break;
sb.Append(c);
}
if (sb.Length > 0)
return int.Parse(sb.ToString());
else
throw new ArgumentException("Unable to read number at the specified index.");
}
Usage in your case would look like:
string some_string = #"A simple demo of SMS text messaging.\r\n+CMGW: 3216\r\n...";
int index = some_string.IndexOf("CMGW") + 6;
int value = some_string.GetNumberAtIndex(index);
Console.WriteLine(value);
Output:
3216
If you're looking to extract the number portion of 'CMGW: 3216' then a more reliable method would be to use regular expressions. That way you can look for the entire pattern, and not just the header.
var some_string = "A simple demo of SMS text messaging.\r\n+CMGW: 3216\r\n\r\nOK\r\n";
var match = Regex.Match(some_string, #"CMGW\: (?<number>[0-9]+)", RegexOptions.Multiline);
var number = match.Groups["number"].Value;
More general, if you don't know the start position of CMGW but the structure remains as before.
String s;
char[] separators = {'\r'};
var parts = s.Split(separators);
parts.Where(part => part.Contains("CMGW")).Single().Reverse().TakeWhile(c => c != ' ').Reverse();

Categories

Resources