How do I populate an array with foreach? - c#

How do I get the data I can write in the console to write to the array and the console.
At the moment it only displays on the console (not added functionality to add to array).
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;
using System.IO;
using System.Text.RegularExpressions;
namespace TBParser
{
class Program
{
static void Main(string[] args)
{
String[] arr = new String[100];
string[] lines = System.IO.File.ReadAllLines(#"C:\ShpereCompare3.txt");
Console.WriteLine("Contents of Text File: ");
foreach (string line in lines)
{
Console.WriteLine("\r\t" + line);
}
System.IO.File.WriteAllLines(#"C:\Test.txt",lines);
Console.WriteLine("Press any key to Exit");
Console.ReadKey();
}
}
}
if my lines of text say
hello
my
name
is
Simon
then the first 5 slots of the array should contain each line?

The line:
string[] lines = System.IO.File.ReadAllLines(#"C:\ShpereCompare3.txt");
is already creating an array, each element of which contains one line.
There is no need to populate a new array with this same information via a foreach.

If you want to copy the lines from the text file into another array, then you can do this:
String[] arr = new String[lines.Length];
Array.Copy(lines, arr, lines.Length);

found a work around. the path i was going down was too complicated. thanks for all your input
fixed code here
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;
using System.IO;
using System.Text.RegularExpressions;
namespace TBParser
{
class Program
{
static void Main(string[] args)
{
string fileName = #"C:shpereCompare3.txt";
List<string> Names = new List<string>();
List<string> Value = new List<string>();
using (StreamReader fileReader = new StreamReader(fileName))
{
string fileLine;
while (!fileReader.EndOfStream)
{
fileLine = fileReader.ReadLine();
if (fileLine.StartsWith("Name"))
{
Names.Add(fileLine.Substring(21));
}
if (fileLine.StartsWith("Center"))
{
string[] fileSplit = fileLine.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
Value.Add(fileSplit[1]);
}
}
string outputString = "";
for (int i = 0;i < Names.Count; i++)
{
outputString += Names[i] + " = " + Value[i] + "\r\n";
}
System.IO.File.WriteAllText(#"C:Test.txt", outputString);
}
}
}
}

Related

Accessing variable in another namespace C#

I know this has been discussed many times on here, I've tried to set my variables as public etc. but I can't seem to be able to use it in my other name space. I'd appreciate if you could give me some tips (I'm a noob at C#)
The string i'm trying access from my other name space is "stringatlinei"
using System;
using System.Diagnostics;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Security;
using System.Security.Cryptography;
using System.IO;
using System.Net;
using Microsoft.Win32;
using System.Runtime.InteropServices;
using System.Text.RegularExpressions;
using System.Net.Mail;
using ConsoleApplication32;
namespace ConsoleApplication32
{
public class Program
{
static void Main(string[] args)
{
DirSearch(#"C:\\Users\\");
Console.ReadKey();
}
static void DirSearch(string dir)
{
try
{
foreach (string d in Directory.GetDirectories(dir))
{
Console.WriteLine(d);
DirSearch(d);
// Compose a string that consists of three lines.
string lines = d;
// Write the string to a file.
System.IO.StreamWriter file = new
System.IO.StreamWriter("c:\\users\\chris\\desktop\\test.txt", true);
file.WriteLine(lines);
file.Close();
var oldLines = System.IO.File.ReadAllLines("c:\\users\\chris\\desktop\\test.txt");
var newLines = oldLines.Where(line => !line.Contains("Windows"));
System.IO.File.WriteAllLines("c:\\users\\chris\\desktop\\test.txt", newLines);
var oldLines4 = System.IO.File.ReadAllLines("c:\\users\\chris\\desktop\\test.txt");
var newLines4 = oldLines.Where(line => !line.Contains("$Recycle.Bin"));
System.IO.File.WriteAllLines("c:\\users\\chris\\desktop\\test.txt", newLines4);
var oldLines7 = System.IO.File.ReadAllLines("c:\\users\\chris\\desktop\\test.txt");
var newLines7 = oldLines.Where(line => !line.Contains("Program Files"));
System.IO.File.WriteAllLines("c:\\users\\chris\\desktop\\test.txt", newLines7);
var oldLines8 = System.IO.File.ReadAllLines("c:\\users\\chris\\desktop\\test.txt");
var newLines8 = oldLines.Where(line => !line.Contains("Program Files (x86)"));
System.IO.File.WriteAllLines("c:\\users\\chris\\desktop\\test.txt", newLines8);
var oldLines9 = System.IO.File.ReadAllLines("c:\\users\\chris\\desktop\\test.txt");
var newLines9 = oldLines.Where(line => !line.Contains("AppData"));
System.IO.File.WriteAllLines("c:\\users\\chris\\desktop\\test.txt", newLines9);
}
}
catch (System.Exception ex)
{
Console.WriteLine(ex.Message);
}
var lineCount = File.ReadLines(#"c:\\users\\chris\\desktop\\test.txt").Count();
Console.WriteLine(lineCount);
Console.ReadLine();
int element = 0;
for (int i = 0; i < lineCount + 1; i++)
{
element = element + 1;
String stringAtLinei = File.ReadLines("c:\\users\\chris\\desktop\\test.txt").ElementAtOrDefault(element);
Console.WriteLine(stringAtLinei);
}
System.Diagnostics.Process process = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
startInfo.FileName = "cmd.exe";
startInfo.Arguments = "random command example thing";
process.StartInfo = startInfo;
process.Start();
}
}
}
then the other namespace etc.
"stringatlinei" is not a property, or a public anything, it is defined inside a loop inside a function.
Try public static string stringatlinei="", then just assign in your loop.
Accessing that variable in another namespace is not possible. You should read up on the basics, scope in particular, to understand why this is so. Here's a helpful article: https://msdn.microsoft.com/en-us/library/aa691132(v=vs.71).aspx
Basically, your variable you are trying access is created inside your for loop. Each iteration of your loop, it goes away.
Here's the part you should change: (I removed the rest for clarity)
namespace ConsoleApplication32
{
public class Program
{
public String stringAtLinei;
static void DirSearch(string dir)
{
for (int i = 0; i < lineCount + 1; i++)
{
stringAtLinei = File.ReadLines("c:\\users\\chris\\desktop\\test.txt").ElementAtOrDefault(element);
}
}
}
}
The point is that you can access fields and properties of a class, but not variables that are confined to the method they're in. So I changed the variable to be a field in the class.

Copy text to specific line

I didn't get why it isn't working..
Error shows like, newArraylist (line 13); newSreamReader (line 14, 24)
does not exist.
Any help will be appreciated.
using System;
using System.IO;
using System.Collections;
namespace InsertLineInTextFile
{
class Program
{
static void Main(string[] args)
{
string strTextFileName = "file.txt";
int iInsertAtLineNumber = 2;
string strTextToInsert = "Amudha";
ArrayList lines = new ArrayList();
StreamReader rdr = new StreamReader(strTextFileName);
string line;
while ((line = rdr.ReadLine()) != null) lines.Add(line);
rdr.Close();
if (lines.Count > iInsertAtLineNumber) lines.Insert(iInsertAtLineNumber, strTextToInsert);
else
lines.Add(strTextToInsert);
StreamWriter wrtr = new StreamWriter(strTextFileName);
foreach (string strNewLine in lines) wrtr.WriteLine(strNewLine);
wrtr.Close();
}
}
}
First, you have to think over what you're going to achieve; reverse engeniering (alas!) says
insert strTextToInsert at iInsertAtLineNumber line of fileName file
(or add the text if the file is too short)
Then implementation:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
...
string fileName = "file.txt";
int iInsertAtLineNumber = 2;
string strTextToInsert = "Amudha";
List<String> lines = File
.ReadLines(fileName)
.ToList();
if (lines.Count > iInsertAtLineNumber)
lines.Insert(iInsertAtLineNumber, strTextToInsert);
else
lines.Add(strTextToInsert);
File.WriteAllLines(fileName, lines);
Please, do not use obsolete class ArrayList but List<T> (List<String> in the question). Often File.ReadLines and File.WriteAllLines are more readable and easier to maintain than StreamReader/StreamWriter.

C# Program Reading, Writing to Console, but Not to File

I am trying to alphabetize all the words in a text file using C#. I am able to read the file and fill the list properly. I am then able to iterate through the list and print to the console. However, while I am iterating, I am also trying to write to an output file. I cannot seem to pinpoint why the output file is empty while the console has all the words printed properly. The file sortedProposal.txt is created, but is empty.
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace IO_Practice
{
class Program
{
static void Main(string[] args)
{
//get the directory of the text file
string directory = Directory.GetCurrentDirectory();
string cd = (Path.Combine(directory, #"..\..\"));
string infileHandle = cd + "AModestProposal.txt";
//print to screen for testing
Console.WriteLine(infileHandle);
//Holds all the words in the story
List<string> words = new List<string>();
//Holds the words from one line
string[] wordHolder;
//Holds each line as it's read
string line;
using (StreamReader sr = new StreamReader(infileHandle))
{
while ((line = sr.ReadLine()) != null)
{
//print to console
Console.WriteLine(line);
//split line into array
wordHolder = line.Split(' ');
//add array to vector
words.AddRange(wordHolder);
}
}
words.Sort();
//Debug
Console.WriteLine("Length of List: " + words.Count());
//create the outfile
string outfileHandle = cd + "sortedProposal.txt";
using(StreamWriter sw = new StreamWriter(outfileHandle)) {
foreach(string word in words)
{
sw.WriteLine(word);
//Debug
Console.WriteLine(word);
}
}
}
}
}

Open a txt file using C# and read the numbers on the file

How can I open a .txt file and read numbers separated by enters or spaces into an array list?
Example:
Now what I want to do is to search (for 1 2 9 ) and send to the console.
I have tried a lot of code but nothing seems to work :(
This is my current code :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace Padroes
{
class Program
{
static void Main(string[] args)
{
try
{
// Open the text file using a stream reader.
const string FILENAME = #"Example.txt";
List<List<int>> data = new List<List<int>>();
string inputLine = "";
StreamReader reader = new StreamReader(FILENAME);
while ((inputLine = reader.ReadLine()) != null)
{
inputLine = inputLine.Trim();
if (inputLine.Length > 0)
{
List<int> inputArray = inputLine.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Select(x => int.Parse(x)).ToList();
data.Add(inputArray);
Console.WriteLine(inputLine);
}
}
}
catch (Exception e)
{
Console.WriteLine("The file could not be read:");
Console.WriteLine(e.Message);
}
Console.ReadKey();
}
}
}
With this code this is my output:
Now what can I do to search only for ( 1 2 9 ) and send only the 1 2 9 to console ?
I belive this would do the trick.. I simply used a StreamReader and looped throught each line.. Im not sure if i got the part of the condition 100% but if i do it should look somthing like this :
StreamReader file = new StreamReader(#"test.txt");
string line= file.ReadLine();
while(line!=null)
{
if (line.Equals("5 8 1 7"))
MessageBox.Show(line);
line = file.ReadLine();
}
Goodluck.
Try this
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace ConsoleApplication1
{
class Program
{
const string FILENAME = #"c:\temp\test.txt";
static void Main(string[] args)
{
List<List<int>> data = new List<List<int>>();
string inputLine = "";
StreamReader reader = new StreamReader(FILENAME);
while((inputLine = reader.ReadLine()) != null)
{
inputLine = inputLine.Trim();
if (inputLine.Length > 0)
{
List<int> inputArray = inputLine.Split(new char[] {' '}, StringSplitOptions.RemoveEmptyEntries).Select(x => int.Parse(x)).ToList();
data.Add(inputArray);
}
}
}
}
}
​

How to read certain text containing line and then append this text to those of multiple files in which this text line is absent?

I have multiple files with *.mol extensions. In the last line in some of them there is "M END" text. I need a program reading all these files, searching for "M END" line in that files and write this "M END" to those of them which have not "M END" line at the end of file.
I wrote the following C# code, but it doesn't work.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace ConsoleApplication6
{
class Program
{
static void Main(string[] args)
{
foreach (string fileName in Directory.GetFiles("C:\\abc\\", "*.mol"))
{
System.IO.StreamReader file = new System.IO.StreamReader(fileName);
if ((file.ReadLine()) != ("M END"))
{
File.AppendAllText(fileName, "M END" + Environment.NewLine);
}
}
}
}
}
Please, help me!
Thanks for all answers.
If your files are not big you can try this
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace ConsoleApplication6
{
class Program
{
static void Main(string[] args)
{
foreach (string fileName in Directory.GetFiles("C:\\abc\\", "*.mol"))
{
bool shouldAddMEnd = false;
using (System.IO.StreamReader sw = new System.IO.StreamReader(fileName))
{
shouldAddMEnd = !sw.ReadToEnd().EndsWith("M END");
}
if (shouldAddMEnd)
File.AppendAllText(fileName, "M END" + Environment.NewLine);
}
}
}
}

Categories

Resources