|
Hi,
Before helping with your problem, let me recommend something to you born out of years of experience:
Don't write your own CSV parser![^]
Seriously, hell is awaiting you if you're trying to parse a CSV file by hand.
Your first thought is, "I need to handle commas inside of quotes."
Your next thought will be, "Oh, crap, I need to handle quotes inside of quotes. Escaped quotes. Double quotes. Single quotes..."
Instead of rolling your own, use an existing library that has done the work for you, such as the free FileHelper[^] library.
Religiously blogging on the intarwebs since the early 21st century: Kineti L'Tziyon
Judah Himango
|
|
|
|
|
It seems you are trying to flush the file after closing it.
Also, please make your code more readable by using the <pre> tag and correct indentation.
|
|
|
|
|
I'm not sure where your problem lies, but
do
{
} while (true); is an infinate loop - never a good idea, plus I can't see anywhere you attempt to break out of it.
DaveBTW, in software, hope and pray is not a viable strategy. (Luc Pattyn)Visual Basic is not used by normal people so we're not covering it here. (Uncyclopedia)
|
|
|
|
|
Something like this ought to do it (assuming you are only splitting by lines and not parsing each line):
do
{
string PiecePath = OutputFolder + "\\" + Path.GetFileNameWithoutExtension(inputFile) + "_" + FileIndex + Path.GetExtension(inputFile);
using (StreamWriter Writer = new StreamWriter(PiecePath, false))
{
Writer.AutoFlush = false;
Writer.WriteLine(strHeader);
int linesOut = 0;
while( (linesOut < sizeOfEachFile) && ((s = reader.ReadLine()) != null) )
{
linesOut++;
Writer.WriteLine(s);
}
}
FileIndex++;
} while (s != null);
There might be the odd misplaced ( or ) - just done off the top of my head.
Have a look at your calculation for sizeOfEachFile - why two a decimal and a double? What do you get when you divide an int by an int and assign it to a decimal?
Regards
David R
|
|
|
|
|
Thanks you very much for all your help its now working properly and I have also taking all your advice under consideration and changed my code accordingly!
Cheers
|
|
|
|
|
You're welcome.
Regards
David R
|
|
|
|
|
Hello,
I've got an easy on for you all.
Since I chose to have input of QueryTime possibly be a decimal (ex ".5"), I have kept it a decimal.
However, Timer.Interval is an int and I need to convert a decimal to an int.
public void StartTimer(decimal QueryTime)
{<br />
int shizz = Decimal.ToInt32(QueryTime);
int wtf = (Decimal.ToInt32(QueryTime) * 60) * 1000;
<br />
QueryTimer.Interval = ((int)QueryTime * 60)* 1000;<br />
QueryTimer.Enabled = true;<br />
<br />
}
Event when QueryTime = 0.5, both shizz and wtf are 0.
Does anyone know how to properly convert a decimal to an integer?
Thanks,
Matt
|
|
|
|
|
A decimal will not fit in an integer so you have to decide in code how you want it to fit.
Have a look at the Math class in particular its Round method with MidPointRoundingMode
DaveBTW, in software, hope and pray is not a viable strategy. (Luc Pattyn)Visual Basic is not used by normal people so we're not covering it here. (Uncyclopedia)
|
|
|
|
|
Hello!
Thanks for your response.
I am giving the users the option to set the interval of the timer. I had specified "minutes." Instead, I can specify "seconds" and keep it int throughout.
However, I'll take a look at this for future reference.
Thanks!
Matt Brown
|
|
|
|
|
In that case, maybe a TimeSpan would be more appropriate?
I used some thing similar in my ApplicationIdle component article[^]
DaveBTW, in software, hope and pray is not a viable strategy. (Luc Pattyn)Visual Basic is not used by normal people so we're not covering it here. (Uncyclopedia)
|
|
|
|
|
Other idea:
int non_wtf = Decimal.ToInt32(QueryTime * 60 * 1000);
Btw, why a decimal? Why not, say, a float or double? Almost everything that uses non-integral values uses either floats or doubles, decimal is rare (and slow, and only meant for when the numbers are for human interaction since they expect 4 instead of 3.99999999 for example)
|
|
|
|
|
Thanks for the input.
I'd like to have users be able to input values of 10-.01 as a string.
I then would like to convert this string to a value.
I would then multiply this value by 60, then 1000.
Then I would like to take this value and change it into an integer.
What value should I be converting the string to perform the calculations?
Thanks,
Matt
|
|
|
|
|
Small tip, multiply by 60000 instead, bit faster.
Since you're turning it into an int anyway, and considering the range of expected values, you could use a float without trouble (several orders of magnitude faster than a decimal )
Something like:
int someFunctionName(string input)
{
return (int)(float.Parse(input) * 60000);
}
warning: untested
In RealLife(tm) you might want to use float.TryParse and do something clever in case it returns false.
|
|
|
|
|
harold aptroot wrote: multiply by 60000 instead, bit faster.
Actually QueryTime * 60 * 1000 is OK, the compiler optimizes that to *60000 while the reader can better see the intent.
Luc Pattyn [Forum Guidelines] [My Articles]
- before you ask a question here, search CodeProject, then Google
- the quality and detail of your question reflects on the effectiveness of the help you are likely to get
- use the code block button (PRE tags) to preserve formatting when showing multi-line code snippets
|
|
|
|
|
Depends on how you write it of course, exactly like "QueryTime * 60 * 1000" it would be ok but most other ways to write it wouldn't be
|
|
|
|
|
Hi Matt,
Everything you tried there, including ((int)QueryTime * 60)* 1000; is wrong; the heart of the problem is (int)x where x is float/double/decimal is rounding towards zero, so if x is between -1 and 1, it will be rounded to zero. You should perform the entire calculation in the highest precision that is present, and only then convert it to an integer.
Luc Pattyn [Forum Guidelines] [My Articles]
- before you ask a question here, search CodeProject, then Google
- the quality and detail of your question reflects on the effectiveness of the help you are likely to get
- use the code block button (PRE tags) to preserve formatting when showing multi-line code snippets
|
|
|
|
|
Hi I'm Tim and this is my first post. I just started coding in C# a few days ago. I'm developing a piece of software to manage some things at work. If anyone here has a few minutes, can you go over my code so far and let me know if it looks solid and please please let me know if I'm doing anything that throws up "warning flags" as far as coding style etc? Thanks in advance!
2 Forms so far.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
ArrayList vins = new ArrayList();
public Form1()
{
InitializeComponent();
}
public void CreateDataTable()
{
string s1 = "Date";
string s2 = "System.String";
DataTable dt = new DataTable();
dt.TableName = textBox1.Text;
while (s1!= "Stop")
{
DataColumn dc = new DataColumn();
dc.ColumnName = s1;
dc.Caption = dc.ColumnName;
dc.DataType = System.Type.GetType(s2);
dc.DefaultValue = null;
dt.Columns.Add(dc);
switch (s1)
{
case "Date":
s1 = "Member#";
s2 = "System.Int32";
break;
case "Member#":
s1 = "VIN#";
s2 = "System.Int32";
break;
case "VIN#":
s1 = "Location Name";
s2 = "System.String";
break;
case "Location Name":
s1 = "Address";
s2 = "System.String";
break;
case "Address":
s1 = "City";
s2 = "System.String";
break;
case "City":
s1 = "State";
s2 = "System.String";
break;
case "State":
s1 = "Zip";
s2 = "System.Int32";
break;
case "Zip":
s1 = "Phone";
s2 = "System.String";
break;
case "Phone":
s1 = "Fax";
s2 = "System.String";
break;
case "Fax":
s1 = "Email";
s2 = "System.String";
break;
case "Email":
s1 = "Stop";
break;
}
}
DataRow dr;
dr = CreateTableRow(dt);
}
public DataRow CreateTableRow(DataTable dtPass)
{
DataRow myRow;
myRow = dtPass.NewRow();
DateTime today = DateTime.Now;
string date;
int year = today.Year;
int month = today.Month;
int day = today.Day;
date = month + "\\" + day + "\\" + year;
myRow[0] = date;
myRow[1] = int.Parse(textBox1.Text);
myRow[2] = int.Parse(textBox2.Text);
return myRow;
}
private void label1_Click(object sender, EventArgs e)
{
}
private void AddTruck()
{
try
{
if (textBox2.Text != null)
{
long vinNumber = long.Parse(textBox2.Text);
vins.Add(vinNumber);
textBox2.Text = "";
label3.Text = label3.Text + vinNumber + Environment.NewLine;
}
}
catch (FormatException)
{
textBox2.Text = "";
}
}
private void button1_Click(object sender, EventArgs e)
{
Form2 f = new Form2(this);
AddTruck();
}
private void OpenContactInfo()
{
}
private void button2_Click(object sender, EventArgs e)
{
try
{
if (textBox1.Text != null)
{
CreateDataTable();
}
}
catch (FormatException)
{
textBox1.Text = "";
}
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form2 : Form
{
Form1 f;
public Form2()
{
InitializeComponent();
}
public Form2(Form1 fr1)
{
InitializeComponent();
f = new Form1();
f = fr1;
}
private void Form2_Load(object sender, EventArgs e)
{
}
}
}
|
|
|
|
|
Overall, it looks pretty good, especially for a beginner. I've seen worse code in production.
Couple thoughts:
Don't use ArrayList. That's old .NET 1.0 junk that boxes every value type you put in it (thus making more memory allocations). It makes your code uglier because when pulling values out, you have to cast it to the correct type. It makes your code more prone to error because you can put other objects besides long s in it.
Since you're just putting VIN#s of type long in that list, use a List<long> instead. The compiler will make sure you don't put anything besides long s in it, it performs better than ArrayList, your code will be cleaner, no boxing required.
Another thought related to int.Parse . int.Parse is OK, however, you should be aware of TryParse alternative method. TryParse won't throw an exception, and will return a value indicating whether the parse was successful:
int value;
bool successfullyParsed = int.TryParse("123", out value);
if (successfullyParsed)
{
}
Since exceptions are costly, you may want to consider TryParse instead of Parse if that fits your code OK. If Parse fits better, feel free to continue using it.
Religiously blogging on the intarwebs since the early 21st century: Kineti L'Tziyon
Judah Himango
|
|
|
|
|
Thanks for the quick response and compliment Judah. I had no idea ArrayList was an outdated item. Goes to show that the internet is getting older.
I don't have time to delve into how List<long> works right now, but it sounds like a more solid option that I will look into. I would assume it behaves similar to ArrayList in that if you delete an item (ie myList[3]), that myList[4] would be copied into myList[3] and so on and so forth. Is this correct? If so, the change will be a no brainer.
|
|
|
|
|
stonebergftw wrote: I would assume it behaves similar to ArrayList in that if you delete an item (ie myList[3]), that myList[4] would be copied into myList[3] and so on and so forth. Is this correct?
Yep, that's right, same semantics as ArrayList.
Religiously blogging on the intarwebs since the early 21st century: Kineti L'Tziyon
Judah Himango
|
|
|
|
|
Welcome.
You should use more descriptive names for your variables and classes.
e.g consider renaming s1 to columnName and s2 to columnDataType, etc. Also, change the default names for your text boxes and buttons. You'll quickly forget what textBox1 & button1 are when you app grows. Same for forms, give them more descriptive names than Form1 and Form2 like DataEntryForm or whatever make sense for each one.
Keep it up
Simon
|
|
|
|
|
Simon,
I expected a response such as yours like a firefighter expects there to be heat around the flames.
Now that you mention it, I'm going to change all those things before this program gets any bigger. Thanks.
|
|
|
|
|
At least your expecting it. For someone who's only been coding a few days you already seem to be more aware of good practises than some pros I can think of. Nice one.
Simon
|
|
|
|
|
Thanks guys.
I'm really confused how this language relates to SQL(I need to set up a database). Am I correct in assuming that my code actually does set up an SQL database? If so, I need to write it so that the data is not lost upon program termination. Any ideas of what I should be looking for(search wise)? I'm feeling pretty lost right now.
|
|
|
|
|
Hi Guys!
How can I change the Visual Settings of a form or a Button in the form. Will Microsoft Expression Blend(MEB) help? However, thats a separate software and I've heard that it can only be implemented on Web Applications. What about Microsoft Silverlight (is that too meant for only Web applications)? How can I interactively decorate a form from within VS.NET with the controls available? Please Help......
Your help will be appreciated....
Thanx, Rajdeep.NET!
|
|
|
|