I want to save listbox items to a txt file while using savefiledialog
This is the code I'm using, it's working but it will put a new line between every item. And I'd like to save without those empty lines. If anyone could help, thanks!
My code:
If ListBox1.Items.Count > 0 Then
SaveFileDialog1.InitialDirectory = "C:/"
SaveFileDialog1.Title = "YOUR RESULTS"
SaveFileDialog1.FileName = Label4.Text
SaveFileDialog1.Filter = ("text files (*.txt) | *.txt")
SaveFileDialog1.ShowDialog()
Dim w As New IO.StreamWriter(SaveFileDialog1.FileName)
Dim i As Integer
For i = 0 To ListBox1.Items.Count - 1
w.WriteLine(ListBox1.Items(i).ToString)
Next
w.Close()
Else
MsgBox("There is nothing to save", MsgBoxStyle.Information)
End If
To remove spaces from the start of a string, use the default String.TrimStart() extension method, as follows:
w.WriteLine(ListBox1.Items(i).ToString.TrimStart)
To remove only spaces from the end, use the default String.TrimEnd()
extension method, and for remove both spaces from start and end of a string, use String.Trim()
Update
I suggest you to use a StringBuilder object as follows:
Dim sb As New StringBuilder
For Each lbItem As Object In ListBox1.Items
sb.Append(lbItem.ToString)
Next
File.WriteAllText(SaveFileDialog1.FileName, sb.ToString, Encoding.Default)
Related
in my VB.net Application id like to overwrite and add new content of a text file
What Code do I need to use?
Thanks
Read (ie: load) everything in the TXT file into your program.
Dim sFullPathToFile As String = Application.StartupPath & "\Sample.txt"
Dim sAllText As String = ""
Using xStreamReader As StreamReader = New StreamReader(sFullPathToFile)
sAllText = xStreamReader.ReadToEnd
End Using
Dim arNames As String() = Split(sAllText, vbCrLf)
'Just for fun, display the found entries in a ListBox
For iNum As Integer = 0 To UBound(arNames)
If arNames(iNum) > "" Then lstPeople.Items.Add(arNames(iNum))
Next iNum
Because you wanted to overwrite everything in the file, we now use StreamWriter (not a StreamReader like before).
'Use the True to indicate it is to be appended to existing file
'Or use False to open the file in Overwrite mode
Dim xStreamWRITER As StreamWriter = New StreamWriter(sFullPathToFile, False)
'Use the carriage return character or else each entry is on the same line
xStreamWRITER.Write("I have overwritten everything!" & vbCrLf)
xStreamWRITER.Close()
I want to be able to create new folders from a list that is stored in a text file.
The names are stored like
test1
test2
test3
so my code so far, loads the path to create the new folders, (which is the oldest folder in the given parent folder) stored in another text file "Foldercreation.txt"
then open the file with the names of the folders I want to create, "Folderstocreate.txt" and stores them all in filereader2.
but then when trying to create the folders for each line nothing happens.
My current code;
Dim fileReader, filereader2 As System.IO.StreamReader
Dim stringreader, parfolder As String
Dim path, foldername As List(Of String)
Dim count As Byte
If MsgBox("Are you sure you want to create these folders?,
Before clicking yes, make sure EVERYONE is out of paperport & you have entered the correct numbers.", MsgBoxStyle.YesNo, "WARNING!") = MsgBoxResult.Yes Then
If strnumbx.Text = "" Then
MsgBox("You have not entered a start number for the folders.", MsgBoxStyle.OkOnly, "Error")
End If
'Loads a text file at the given location, to read to.
fileReader = My.Computer.FileSystem.OpenTextFileReader("C:\Data\Test\Foldercreation.txt")
'Set stringreader as the read line from the file
stringreader = fileReader.ReadLine()
path = System.IO.Directory.GetDirectories(stringreader).ToList
path.Sort()
count = path.Count - 1
parfolder = path(count)
'System.IO.Directory.CreateDirectory(parfolder & "\test")
filereader2 = New StreamReader("C:\Data\Test\Folderstocreate.txt", True)
filereader2.ReadToEnd()
For Each line In filereader2.ReadToEnd()
System.IO.Directory.CreateDirectory(parfolder & fileReader.ReadToEnd(count - 1))
count = count + 1
Next
End If
fileReader.Close()
filereader2.Close()
This function would do it but you may want to put in some exception handling.
Directory.CreateDirectory will create all parent folders if they don't exist.
Private Sub CreateAllDirectories(ByVal strFileList As String)
Dim strDirectories As String() = File.ReadAllLines(strFileList)
For Each strDirectory As String In strDirectories
If Not Directory.Exists(strDirectory) Then
Directory.CreateDirectory(strDirectory)
End If
Next
End Sub
FIRST PROBLEM:
I am looking for an easiest way to read multiple text files at one time and extract all the duplicate lines from each text file and copy those duplicate lines to a new text file with headings representing name of parent text file. I am dealing with more than 20 text files at a time and it is a mess to go through each one by one. Secondly, I am dealing with large / heavy file (more or less 30,000 lines in each file) .. I am currently using a program with "Stream Reader" and "Stream Writer" and I prefer to have the same approach for my understanding. OR any new and easy way is Welcome !!
SECOND PROBLEM:
I want to compare 2 text files and get the duplicate lines on to a new text file. I don't want to remove/delete/overwrite: Just to copy them across to a new text file.
Please use openfiledialog and savefiledialog for the files.
Thanks a lot in advance.
Best Regards
VB_Learner
Dim Dim optxtfile As New OpenFileDialog
optxtfile.RestoreDirectory = True
optxtfile.Multiselect = False
optxtfile.Filter = "txt files (*.txt)|*.txt"
optxtfile.FilterIndex = 1
optxtfile.ShowDialog()
If (Not optxtfile.FileName = Nothing) Then
Dim lines As New List(Of String)
Using sr As New System.IO.StreamReader(optxtfile.FileName)
While sr.Peek <> -1
Dim line As String = sr.ReadLine()
Dim isNew As Boolean = True
For Each dupl As String In lines
If (dupl = line) Then isNew = False
Next
If (isNew) Then lines.Add(sr.ReadLine())
End While
End Using
Dim svDir As String
If (My.Computer.FileSystem.FileExists(optxtfile.FileName)) Then
My.Computer.FileSystem.DeleteFile(optxtfile.FileName)
svDir = optxtfile.filename
Dim svtxtfile As New SaveFileDialog
svtxtfile.RestoreDirectory = True
svtxtfile.Filter = "txt files (*.txt)|*.txt"
svtxtfile.FilterIndex = 1
svtxtfile.ShowDialog()
If (svtxtfile.FileName = Nothing) Then
svDir = optxtfile.FileName
Else
svDir = svtxtfile.FileName
End If
End If
Using write2text As New System.IO.StreamWriter(svDir)
For Each line As String In lines
write2text.WriteLine(line)
Next
End Using
End If
End Sub
Helo there!
it seems that i am facing a problem with my code in VB.net. Please be patient as i am a complete beginner in programming. I am trying to code a program that will load 2 or more txt files, find and exclude specific lines (starting with some characters or contain some characters) and then merge and save only one file that will contain all the information after the editing (from all the files).
I am using openfiledialog and i have set the multiselect to true. Below is the code for the OpenfileDialog:
If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
For Each File In OpenFileDialog1.FileNames
My.Computer.FileSystem.ReadAllText(OpenFileDialog1.FileName)
Next
If i am correct, it loads the filenames and reads all the text from the files. For the editing i am using the following code:
Dim outputLines As New List(Of String)()
For Each line As String In System.IO.File.ReadLines(OpenFileDialog1.FileName)
Uline1 = line.StartsWith("text1")
Uline2 = line.StartsWith("text2")
Uline3 = line.StartsWith("text3")
Uline4 = line.StartsWith("text4")
Uline5 = line.StartsWith("text5")
Uline6 = line.StartsWith("text7")
Uline7 = line.StartsWith("sometext")
Trash = line.Contains("^")
If Uline1 Or Uline2 Or Uline3 Or Uline4 Or Uline5 Or Uline6 Or Uline7 Or Trash Then
outputLines.Remove(line)
Else
outputLines.Add(line)
End If
Next
For the output i am using a savefiledialog with the following code:
SaveFileDialog1.DefaultExt = "txt"
SaveFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*"
SaveFileDialog1.RestoreDirectory = True
If (SaveFileDialog1.ShowDialog() = DialogResult.OK) Then
System.IO.File.WriteAllLines(SaveFileDialog1.FileName, outputLines)
Although the files are being loaded correctly, the edit seems to happen only in one file (the last selected) and again the program saves only one file.
Could you please point me to the right direction?
You need to nest your loops through the file names returned by the open file dialog, and the lines returned by the ReadLines calls. You also don't need to remove lines from the outputLines list, since they are never added. Something like:
If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
Dim outputLines As New List(Of String)()
For Each fileName In OpenFileDialog1.FileNames
For Each line As String In System.IO.File.ReadLines(fileName)
Uline1 = line.StartsWith("text1")
Uline2 = line.StartsWith("text2")
Uline3 = line.StartsWith("text3")
Uline4 = line.StartsWith("text4")
Uline5 = line.StartsWith("text5")
Uline6 = line.StartsWith("text7")
Uline7 = line.StartsWith("sometext")
Trash = line.Contains("^")
If Not (Uline1 Or Uline2 Or Uline3 Or Uline4 Or Uline5 Or Uline6 Or Uline7 Or Trash) Then
outputLines.Add(line)
End If
Next
Next
End If
If the files are very large you will start to run into memory issues, and will need to write the data out as it is read instead of keeping it all in memory.
UPDATE
Based on the comments, if you want to check the following line to determine if the current line should be written, you could use something like this. Note the use of ReadAllLines and the For loop.
Dim outputLines As New List(Of String)()
For Each fileName In OpenFileDialog1.FileNames
Dim lines() As String = System.IO.File.ReadAllLines(fileName)
For i As Integer = 0 To lines.Count - 1
Dim line As String = lines(i)
If line.StartsWith("19") AndAlso i < lines.Count - 2 AndAlso lines(i + 1).StartsWith("15") Then
outputLines.Add(line)
outputLines.Add(lines(i + 1))
i += 1
End If
Next
Next
I am trying to right the information from a combobox into a text file so it can be saved. If the information in the combobox is John, Marry, Jack I would like it to appear in the text file like this:
John
Mary
Jack
The code I currently use give a result of JohnMaryJack in the text file
For Each item As Object In cmbworld.Items
Dim test As String
test = item
sb.AppendFormat("{0}", item)
Dim FILE_NAME As String = "D:\Documents\test.txt"
If System.IO.File.Exists(FILE_NAME) = True Then
Dim objWriter As New System.IO.StreamWriter(FILE_NAME)
objWriter.Write(test)
objWriter.WriteLine()
objWriter.Close()
MsgBox("Text written to file")
Else
MsgBox("File Does Not Exist")
End If
Next
How would I fix this?
First I would take the writing to the file out of the For Each-loop. This way you only write to the file once.
Second you can slightly adapt the answer of #BiggsTRC to
sb.AppendFormat("{0} {1}", item, Environment.NewLine)
Furthermore you use the variable test to write to the textfile, instead of the stringbuilder you used. This way the formating never gets into the file.
So than your piece of code looks something like this:
Dim sb as new StringBuilder()
For Each item As Object In cmbworld.Items
'Dim test As String
'test = item
sb.AppendFormat("{0} {1}", item, Environment.NewLine)
Next
Dim FILE_NAME As String = "D:\Documents\test.txt"
If System.IO.File.Exists(FILE_NAME) = True Then
Dim objWriter As New System.IO.StreamWriter(FILE_NAME)
objWriter.Write(sb.ToString()) 'Use the stringbuilder here
objWriter.WriteLine()
objWriter.Close()
MsgBox("Text written to file")
Else
MsgBox("File Does Not Exist")
End If
There could be some syntax-minor error in it, cause it's a long time I've written VB and I haven't a VS present at the moment, but I think you get the picture ;-)
I think you just need to change this line:
sb.AppendFormat("{0}", item)
To be like this:
sb.AppendFormat("{0}\r\n", item)
(notice the space after the {0})
This will give you a space after each person's name so that you will end up with one name per line with a return after the last line.
IO.File.WriteAllLines(filename, (From p As String In cmbworld.Items).ToArray)