Closed. This question does not meet Stack Overflow guidelines. It is not currently accepting answers.
We don’t allow questions seeking recommendations for books, tools, software libraries, and more. You can edit the question so it can be answered with facts and citations.
Closed 2 years ago.
Improve this question
I have a .txt file with the following:
F Am G F
I was tired of my lady,
Gm7 C E D C
We'd been together too long.
Dm7 F Am G F
Like a worn out recording,
Gm7 C E D C
of a favorite song.
I want to produce a txt file with the following output:
I was tired of my [F]lady,[Am][G][F]
We'd been toge[Gm7]ther too [C]long.[E][D][C]
Like a worn [Dm7]out recor[F]ding,[Am][G][F]
of a fa[Gm7]vorite [C]song.[E][D][C]
Note:
The chords (i.e. F, Am, G, F etc.) have been inserted into the line below (it can be before or in a word; approximate location is fine)
Square brackets have been added around the chords (i.e. F, Am, G, F etc.)
I am a C# developer, so I would like to use a C# library of some sort to do the above.
As per Flydog57:
Use the File class to read the first 2 lines into 2 string (chords and text). Create a StringBuilder object (say buffer). Find the index of the first non-space character in chords. Get the Substring of the text string up to that point, and Append it to buffer. Get a Substring from chords (based on the index of the next space). Format it using string interpolation and Append it to buffer. Repeat to the end of the line, and then repeat for every pair of lines in the file
The following code uses chord positions and lyric character positions to merge every two lines in your Lyric/Chord data.
The below class will do the work to parse the lines and merge them into
a single line with Lyrics and Chords.
public class LyricAndChordMerger
{
public IList<string> MakeMergedLines(string[] lines)
{
IList<string> mergedLines = new List<string>();
for (int i = 0; i < lines.Length; i = i + 2)
{
string chordLine = lines[i];
string lyricLine = lines[i + 1];
Dictionary<int, string> chords = MakeChordsArray(chordLine);
string mergedLine = string.Empty;
for (int j = 0; j < chordLine.Length; j++)
{
string chord = string.Empty;
if (chords.ContainsKey(j))
{
chord = chords[j] ?? "";
if (chord.Length > 0) chord = string.Format("[{0}]", chord);
}
string lyricChar = "";
if (lyricLine.Length > j)
{
lyricChar = lyricLine[j].ToString();
}
mergedLine += chord + lyricChar;
}
mergedLines.Add(mergedLine);
}
return mergedLines;
}
public Dictionary<int, string> MakeChordsArray(string chordLine)
{
string[] values = chordLine.Split(' ');
Dictionary<int, string> chordsAndPositions = new Dictionary<int, string>();
int indexOffset = 0;
for (int i = 0; i < values.Count(); i++)
{
int index = i + indexOffset;
chordsAndPositions.Add(index, values[i]);
int valueLength = values[i].Length;
indexOffset += valueLength <= 1 ? 0 : valueLength - 1;
}
return chordsAndPositions;
}
}
And you would use it like so...
string inputFile = "[path to your lyrics and chord file]";
string[] inputLines;
using (var sr = new StreamReader(inputFile))
{
inputLines = sr.ReadToEnd().Split(new char[]{'\n','\r'}, StringSplitOptions.RemoveEmptyEntries);
}
var merger = new LyricAndChordMerger();
IList<string> mergedLines = merger.MakeMergedLines(inputLines);
foreach (string line in mergedLines)
{
Console.WriteLine(line);
}
And the output looks like...
I was tired of my [F]lady[Am],[G][F]
We'd been to[Gm7]gether too [C]long[E].[D][C]
Like a worn [Dm7]out reco[F]rding[Am],[G][F]
of a [Gm7]favorite [C]song[E].[D][C]
Related
Closed. This question needs details or clarity. It is not currently accepting answers.
Want to improve this question? Add details and clarify the problem by editing this post.
Closed 3 months ago.
Improve this question
I want to remove bytes from an array, I don't want to remove all bytes 0x6f I just want to remove two only of them. This is my code:
string msg = "gooooooal";
byte[] oldArray = Encoding.GetEncoding(1256).GetBytes(msg);
byte[] newArray = oldArray.Where(b => b != 0x6f).ToArray();
You can first find the position and then remove them
byte[] oldArray = Encoding.GetEncoding(1256).GetBytes(msg);
int howManyToRemove = 2; //How many items to remove
var positions = new List<int>();
int lastPos = -1;
for (int i = 0; i < howManyToRemove; i++)
{
var position = Array.IndexOf(oldArray, (byte)0x6f,lastPos+1);
if (position == -1)
{
break;
}
lastPos=position;
positions.Add(position);
}
byte[] newArray = oldArray.Where((val, idx) => !positions.Contains(idx)).ToArray();
If I understood your problem then if want to delete two occurrences of the letter o from your string because the 0x6f ASCII value is 111 which is the letter o.
and for that, you are making the solution very complex.
if can simply do like this.
string s = "gooooooal";
string output = removeChar(s, 'o'); //output will be gooool
static string removeChar(string s,
char ch)
{
int count = 2;
for (int i = 0; i < s.Length; i++)
{
// If ch is found
if (s[i] == ch && count > 0)
{
s = s.Substring(0, i) +
s.Substring(i + 1);
count--;
}
}
return s;
}
Closed. This question needs details or clarity. It is not currently accepting answers.
Want to improve this question? Add details and clarify the problem by editing this post.
Closed 3 years ago.
Improve this question
How to add like number or character pattern to my random keygen?
and is it hard becuse im new to coding :) Thx for Help!
it took me alot of time to get to this and been stuck here for 1 and half day and can't find way to add patterns to this
Like This :
D4B6C5604E26-4F1198-44C1
EA3705694B8A-478E83-2D01
D3B8E2DE7BFC-49CF95-68E6
A6CD996B352A-48B89A-8C69
After - 4 Numbers and After second - 3 Numbers
static void Main(string[] args)
{
var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
var stringChars = new char[12];
var stringChars4 = new char[6];
var stringChars7 = new char[4];
var random = new Random();
for (int i = 0; i < stringChars.Length; i++)
{
stringChars[i] = chars[random.Next(chars.Length)];
}
for (int i = 0; i < stringChars4.Length; i++)
{
stringChars4[i] = chars[random.Next(chars.Length)];
}
for (int i = 0; i < stringChars7.Length; i++)
{
stringChars7[i] = chars[random.Next(chars.Length)];
}
var finalString = new String(stringChars);
var finalString4 = new String(stringChars4);
var finalString7 = new String(stringChars7);
var chars2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
var stringChars2 = new char[12];
var stringChars5 = new char[6];
var stringChars8 = new char[4];
var randoms = new Random();
for (int i = 0; i < stringChars.Length; i++)
{
stringChars2[i] = chars2[random.Next(chars.Length)];
}
for (int i = 0; i < stringChars5.Length; i++)
{
stringChars5[i] = chars2[random.Next(chars.Length)];
}
for (int i = 0; i < stringChars8.Length; i++)
{
stringChars8[i] = chars2[random.Next(chars.Length)];
}
var finalString2 = new String(stringChars2);
var finalString8 = new String(stringChars8);
var finalString5 = new String(stringChars5);
var chars3 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
var stringChars3 = new char[12];
var stringChars6 = new char[6];
var stringChars9 = new char[4];
var randomss = new Random();
for (int i = 0; i < stringChars3.Length; i++)
{
stringChars3[i] = chars3[random.Next(chars3.Length)];
}
for (int i = 0; i < stringChars6.Length; i++)
{
stringChars6[i] = chars3[random.Next(chars3.Length)];
}
for (int i = 0; i < stringChars9.Length; i++)
{
stringChars9[i] = chars3[random.Next(chars3.Length)];
}
var finalString3 = new String(stringChars3);
var finalString6 = new String(stringChars6);
var finalString9 = new String(stringChars9);
Console.WriteLine("Keys:");
Console.WriteLine();
Console.ReadKey();
Console.WriteLine(finalString + "-" + finalString4 + "-" + finalString7);
Console.WriteLine();
Console.ReadKey();
Console.WriteLine(finalString2 + "-" + finalString5 + "-" + finalString8);
Console.WriteLine();
Console.ReadKey();
Console.WriteLine(finalString3 + "-" + finalString6 + "-" + finalString9);
Console.WriteLine();
Console.ReadKey();
}
Assuming you are looking for "get string of random characters (from given set of characters) that formatted to given specification like 'xxx-xx-xxxx!xxx' where 'x' is random character".
Regex.Replace is a nice way to construct such string - it let you run arbitrary code to construct replacement - so replacing every 'x' with randomly selected character will produce result you seem to be looking for:
var r = new Random();
// convert string to array of strings for individual characters as Replace wants strings
var charsAsStrings = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
.Select(x=>x.ToString()).ToArray();
var result = Regex.Replace("xxx-xxx", "x",
m => charsAsStrings[r.Next(charsAsStrings.Length)]));
Notes:
make sure to read Random number generator only generating one random number to properly instantiate Random.
random numbers/strings are not unique. Presumably you will store them in some sort of list/database and re-generate the once that are not unique
using similarly-looking symbols like 'O' and '0' (or 'I', 'l','1') in strings that may need to be read by humans is not the best idea.
Create a function for the code generation, it makes the main method more readable.
private static readonly Random _random = new Random();
private static string CreateCode()
{
var bytes = new byte[11];
_random.NextBytes(bytes);
string s = BitConverter.ToString(bytes).Replace("-", "");
string result = new StringBuilder(s)
.Insert(18, '-')
.Insert(12, '-')
.ToString();
return result;
}
static void Main(string[] args)
{
const int N = 3;
var codes = new string[N];
for (int i = 0; i < N; i++) {
codes[i] = CreateCode();
Console.WriteLine(codes[i]);
}
}
I use the Random.NextBytes method to generate random bytes. We need 11 of them, because one byte is represented by 2 hex positions.
Your codes are in hexadecimal format, i,e, they contain only the letters A - F and digits. This solution uses the BitConverter to format a byte array as hexadecimal string. It produces strings like ""BD-EB-1F-0C-9B-9E-0C-F5-6E-2E-46". Therefore it is necessary to remove the "-" first.
Then I convert the string into a StringBuilder. The latter one has a Insert method that we can use to insert dashes at the required places. I insert the second one first, so that the index of the other one is not shifted.
You could also simply call Console.WriteLine(CreateCode()); three times and not create the codes array. But if you want to do other things with the codes, like saving them to a file or copy them to the cilpboard, it's better to store them somewhere.
Closed. This question needs debugging details. It is not currently accepting answers.
Edit the question to include desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem. This will help others answer the question.
Closed 6 years ago.
Improve this question
I have the following problem:
I have a .txt file form my professor, which contains different numbers.Every number is in another line. There is nothing else in this file.
Those numbers represent coordinates, eg. first line = first x coord., second line = first y coord. and so on. We may not use LINQ.
So my question is: How can I transfer these numbers into an 2d-array like the following?
coordArray[0,0] = line1 of textfile (x1)
coordArray[0,1] = line2 (y1)
coordArray[1,0] = line3 (x2)
I already tried the following without success:
string path = #"C:\coords.txt";
int lines = (File.ReadAllLines(path).Count())/2;
List<double> xy = new List<double>();
using (StreamReader r = new StreamReader(path))
{
string coord;
while ((coord = r.ReadLine()) != null)
{
xy.Add(double.Parse(coord));
}
}
double[,] coordArray = new double[lines, 2];
for(int i = 0; i<lines; i+=2)
{
for(int j = 0; j<lines; j++)
{
coordArray[j, 0] = xy[i];
coordArray[j, 1] = xy[i + 1];
}
}
You could try change last two for cycles in your example into:
for(int i = 0; i<lines; i+=2)
{
coordArray[i/2, 0] = xy[i];
coordArray[i/2, 1] = xy[i + 1];
}
Your original solution with two for cycles iterates twice over all lines while you want go through them just once but process two lines in every iteration.
note: when there is even number of lines then program will throw an exception
Closed. This question needs details or clarity. It is not currently accepting answers.
Want to improve this question? Add details and clarify the problem by editing this post.
Closed 7 years ago.
Improve this question
I have a code where if i pass a inputdata as "sail" my code will generate a masked output such as "aisl" or "isal". where the output will be jumbled format of input. I want to have a output which should not generate the output with the same exact letters in the input.Below is my current code and please help me with this
string InputData = "123456";
string MaskedData = InputData;
if (MaskedData.Length > 0)
{
// The technique used to mask the data is to replace numbers with random numbers and letters with letters
//char[] chars = new char[InputData.Length];
char[] chars = new char[InputData.Length];
Random rand = new Random(DateTime.Now.Millisecond);
int index = 0;
while (InputData.Length > 0)
{
// Get a random number between 0 and the length of the word.
int next = rand.Next(0, InputData.Length - 1);
// Take the character from the random position and add to our char array.
//chars[index] = InputData[next];
chars[index] = InputData[next];
// Remove the character from the word.
InputData = InputData.Substring(0, next) + InputData.Substring(next + 1);
++index;
}
MaskedData = new String(chars);
}
In this page in dotnetperls.com there is an algorithm that randomizes an array of strings. With a few changes you can use it to randomize a string, using the fact that a string is also an array of chars. Here you have:
static class RandomCharArrayTool
{
static Random _random = new Random();
public static string RandomizeChars(string theString)
{
var arr = theString.ToCharArray();
List<KeyValuePair<int, char>> list = new List<KeyValuePair<int, char>>();
// Add all strings from array
// Add new random int each time
foreach (char s in arr)
{
list.Add(new KeyValuePair<int, char>(_random.Next(), s));
}
// Sort the list by the random number
var sorted = from item in list
orderby item.Key
select item;
// Allocate new string array
char[] result = new char[arr.Length];
// Copy values to array
int index = 0;
foreach (KeyValuePair<int, char> pair in sorted)
{
result[index] = pair.Value;
index++;
}
// Return string generated from copied array
return new string(result);
}
}
You use it like this:
RandomCharArrayTool.RandomizeChars("sail");
Please try with the below code snippet.
Mehtod 1:
string word = "123456";
string temp = word;
string result = string.Empty;
Random rand = new Random();
for (int a = 0; a < word.Length; a++)
{
//multiplied by a number to get a better result, it was less likely for the last index to be picked
int temp1 = rand.Next(0, (temp.Length - 1) * 3);
result += temp[temp1 % temp.Length];
temp = temp.Remove(temp1 % temp.Length, 1);
}
string str = result;
Method2:
var rnd = new Random();
string InputData = "123456";
string MaskedData = new string(InputData.OrderBy(r => rnd.Next()).ToArray());
You have several different approaches, however the easiest may be to implement a SecureString or a Hash. One of those two would encrypt your data quite easily. Under the notion the mask is to hide said contents.
// SecureString
var secure = new SecureString();
foreach(var character in textbox.Text.ToCharArray())
secure.AppendChar(character);
Once your string is placed on memory, it would be encrypted on memory. That is a rough implementation, but documentation will help you refine the approach to your needs.
// Hash (BCrypt for simplicity)
private const int factor = 12;
var hashed = BCrypter.HashPassword(textbox.Text, BCrypter.GenerateSalt(factor));
Another approach would simply be randomization, similar to a word shuffle. Like the other answers have demonstrated.
Closed. This question does not meet Stack Overflow guidelines. It is not currently accepting answers.
This question appears to be off-topic because it lacks sufficient information to diagnose the problem. Describe your problem in more detail or include a minimal example in the question itself.
Closed 9 years ago.
Improve this question
I need help building a regex.
In my MVC5 view I have a text area that will contain or more groups of integers which can contain 6, 7, or 8 characters each.
In my controller I need to extract all of these numbers from the input string and put them into an array.
Examples would be:
123456 123457 123458
or
123456
123457
123458
or
123456,123457, 123458
These groups may or may not have 1 or 2 leading zeroes:
00123456, 00123457 123458
This is what I ended up with:
public string[] ExtractWorkOrderNumbers(string myText)
{
var result = new List<string>();
var regex = new Regex(#"( |,)*(\d+)");
var m = regex.Match(myText);
while (m.Success)
{
for (int i = 1; i <= 2; i++)
{
var wo = m.Groups[2].ToString();
if (result.Count == 0)
{
result.Add(wo);
}
else
{
var x = (from b in result where b == wo select b).ToList().Count;
if (x == 0) result.Add(wo);
}
}
m = m.NextMatch();
}
return result.ToArray();
}
Assumption: zero or more spaces and/or commas serve as delimiters.
[TestMethod()]
public void TestMethod3()
{
var myText = "123456 1234567, 123458, 00123456, 01234567";
var regex = new Regex(#"( |,)*(\d+)");
var m = regex.Match(myText);
var matchCount = 0;
while (m.Success)
{
Console.WriteLine("Match" + (++matchCount));
for (int i = 1; i <= 2; i++)
{
Group g = m.Groups[i];
Console.WriteLine("Group" + i + "='" + g + "'");
CaptureCollection cc = g.Captures;
for (int j = 0; j < cc.Count; j++)
{
Capture c = cc[j];
Console.WriteLine("Capture" + j + "='" + c + "', Position=" + c.Index);
}
}
m = m.NextMatch();
}
}
Output:
(For each match, all Group2's are your matches, Group1 is the delimiter)
Match1
Group1=''
Group2='123456'
Capture0='123456', Position=0
Match2
Group1=' '
Capture0=' ', Position=6
Group2='1234567'
Capture0='1234567', Position=7
Match3
Group1=' '
Capture0=',', Position=14
Capture1=' ', Position=15
Group2='123458'
Capture0='123458', Position=16
Match4
Group1=' '
Capture0=',', Position=22
Capture1=' ', Position=23
Group2='00123456'
Capture0='00123456', Position=24
Match5
Group1=' '
Capture0=',', Position=32
Capture1=' ', Position=33
Group2='01234567'
Capture0='01234567', Position=34
By using the named capturing groups feature of regular expressions (Regex), we can extract the data from matching patterns. In your case, we can extract the non-zero integer portion of the text string:
using System.Text.RegularExpressions;
// A pattern consisting of at most two leading zeros followed by 6 to 8 non-zero digits.
var regex = new Regex(#"^[0]{0,2}(?<Value>[1-9]{6,8})$");
var firstString = "123456";
var secondString = "01234567";
var thirdString = "0012345678";
var firstMatch = regex.Match(firstString);
var secondMatch = regex.Match(secondString);
var thirdMatch = regex.Match(thirdString);
int firstValue = 0;
int secondValue = 0;
int thirdValue = 0;
if (firstMatch.Success)
int.TryParse(firstMatch.Groups["Value"].Value, out firstValue);
if (secondMatch.Success)
int.TryParse(secondMatch.Groups["Value"].Value, out secondValue);
if (thirdMatch.Success)
int.TryParse(thirdMatch.Groups["Value"].Value, out thirdValue);
Console.WriteLine("First Value = {0}", firstValue);
Console.WriteLine("Second Value = {0}", secondValue);
Console.WriteLine("Third Value = {0}", thirdValue);
Output:
First Value = 123456
Second Value = 1234567
Third Value = 12345678