C# chr függvény használata

C# chr függvény használata
2015-09-29T12:30:05+02:00
2015-09-30T15:18:33+02:00
2022-10-15T23:00:19+02:00
Janos67
Sziasztok!

A lassan fejlődő C# tudásomat arra szeretném most felhasználni, hogy írjak egy saját *.csv fájlfeldolgozót. Mi sem egyszerűbb - gondoltam én. Beolvasom a sorokat, végigmegyek a sorok karakterein, megvizsgálva annak tartalmát (ugye pontosvesszőt keresek és figyelem az idézőjeleket).
A pontosvesszővel nincs is gond, mert ha a sor tartalma a Sor változóban van, az aktuális pozíciót az i változó adja, akkor

if (Sor.Substring(i, 1) == ";") {...

Na, de hogy teszteljem le ugyanezt idézőjelre?
Gondoltam, csinálok egy ilyet:

char Idezojel = (char)34;

És jöhetne ez:

if (Sor.Substring(i, 1) == Idezojel) {...

De már lefordítani sem engedi.

Mit tudnátok javasolni nekem ilyenkor?

Köszi szépen előre is a segítséget!
Mutasd a teljes hozzászólást!
int i = 34;
char c = (char)i;

vagy egyszerűen: "\""


Megjegyzés: csv a "comma separated values" kifejezés rövidítése, azaz "vesszővel tagolt értékek" kifejezésnek felel meg. Tehát nem ; hanem , tagolja a csv file-okat. Természetesen tetszőleges karaktert lehet egy file tagolásához használni, csak azokat nem csv-nek kéne hívni.
Mutasd a teljes hozzászólást!

  • string Sor = ...; if (Sor[i] == ';') ...; if (Sor[i] == '"') ...;
    Mutasd a teljes hozzászólást!
  • int i = 34;
    char c = (char)i;

    vagy egyszerűen: "\""


    Megjegyzés: csv a "comma separated values" kifejezés rövidítése, azaz "vesszővel tagolt értékek" kifejezésnek felel meg. Tehát nem ; hanem , tagolja a csv file-okat. Természetesen tetszőleges karaktert lehet egy file tagolásához használni, csak azokat nem csv-nek kéne hívni.
    Mutasd a teljes hozzászólást!
  • Szia,

    Az aposztrófos megoldásra azt mondta, hogy karaktert és string-et nem tudok az == -vel összehasonlítani.

    Köszi szépen!
    Mutasd a teljes hozzászólást!
  • Szia,

    Valószínűleg a nagy "igyekezetemben" nem jutott eszembe ez a backslash-féle megközelítés, amit amúgy nap-mint-nap használok Perl-ben és PHP-ban egyaránt. Minek is rontanék kalapáccsal valamire, amihez amúgy is van egy kis csavarhúzóm! :D

    Köszi szépen!

    Igazad van a csv valódi jelentését illetően, de ott, ahol ezt a progit alkalmaznom kell, ott ilyen csv-t adnak forrásul, amiben pontosvesszővel határolja az Excel (!!) a végeredményt és ettől nem akarnak tágítani. Az is problémaként merül fel, hogy természetesen vannak olyan mezők, amikben vannak pontosvesszők, ezért most szóba sem jöhet a c# split alkalmazása.
    Na, de hol jövök én ahhoz, hogy megmondjam, milyen formában adják a forrást. Ezért kényszerülök egy saját sorfeldolgozót írni.
    Mutasd a teljes hozzászólást!
  • > Tehát nem ; hanem , tagolja a csv file-okat.

    Nem kellene a derék kérdezőt beküldeni az erdőbe: a nálunk eléggé elterjedt magyar Excel változatok alapértelmezésben vesszőpontot használnak/várnak a CSV-fájlokban.
    Mutasd a teljes hozzászólást!
  • Nem lettem beküldve, onnan jöttem, amíg fogalmam (na jó, alapvető csak) nem volt a C#-ról :)
    Mutasd a teljes hozzászólást!
  • Én nem azt írtam, hogy az excel mit és hogyan értelmez, hanem leírtam, hogy a csv fogalom az mit jelent. Az más kérdés, hogy az excel beviszi a felhasználókat (és remélhetőleg nem a programozókat) a bokorba azzal, hogy a windows alapértelmezett lista szeparátora által tagolt file-okat csv-nek nevezi. Csak azért, mert az amerikai windows-on az alapértelmezett lista szeparátor az vessző.

    Hozzátenném, hogy ez nem excel, hanem oprendszer beállítás függő dolog. Ha angol (US) excel-t telepítesz, de az alapértelmezett windows lista szeparátor az ";", akkor ugyanúgy ;-vel tagolt file-t kezel alapértelmezésben az excel a felhasználói felületen keresztül.
    Mutasd a teljes hozzászólást!
  • Azért elég erős dolog a "névre" hagyatkozni 

    Ilyen alapon dobjunk el minden SQL adatkezelő izét, mert van nekünk ezer éve DBF-ünk, ez meg ugye (a neve is megmondja) DataBaseFile

    De hogy komolyabb legyek.  
    Az RFC-ket elég autentikus standardnak találod?

    Az RFC 4180 azt mondja hogy:

    "• In locales where the comma character is used in place of a decimal point in numbers, the separator between fields/columns is often a semicolon."

    Igaz kivételes esetként említi, de ha megemlíti az már azt jelenti, hogy kvázi standard. [aki nem törődik vele ráfarag, mint a CSV import programok, amik mereven comma separator alapuak, 'oszt csodálkoznak, hogy nem működik a dolog ]

    Egy másik autentikus forrás (a Wikipedia... sokaknál ez a kezdet és gyakran a vég is az információ keresésben) már eleve a megengedőbb, delimiter változatokban gondolkodó formátum specifikációról ír.
    Mutasd a teljes hozzászólást!
  • Azért nem ártana, ha egy programozó különbséget tudna tenni egy rfc és egy weboldal között...

    Az rfc4180 itt található

    Az rfc-ben 2 dologban megengedőek a struktúrát illetően: van-e fejléc sor, illetve a sorokat nem feltétlenül crlf-fel kell elkülöníteni.

    A linkelt wikipedia oldal pedig remekül összefoglalja a helyzetet:

    A comma-separated values (CSV) file stores tabular data (numbers and text) in plain text. Each line of the file is a data record. Each record consists of one or more fields, separated by commas. The use of the comma as a field separator is the source of the name for this file format.

    ...

    In popular usage, however, the term CSV may denote some closely relateddelimiter-separated formats, which use a variety of different field delimiters. These include tab-separated values and space-separated values, both of which are popular. Such files are often even given a .csv extension, despite the use of a different field separator than the comma. This loose terminology creates problems for data exchange

    Pont abból adódik a probléma, hogy még sok programozó sem veszi figyelembe a nevet és használ mindenféle mezőhatárolót, miközben csv-nek hívja a file-t.
    Mutasd a teljes hozzászólást!
  • Azért elég erős dolog a "névre" hagyatkozni

    Miért erős dolog? A számítástechnikában nem véletlenül adnak neveket kü,lönböző fogalmaknak, koncepcióknak, mert rajtuk keresztül - elvileg - mindenkinek tudnia kell, hogy miről is van szó. Ha itt a prog.hu-n leírod, hogy c#, akkor mindenki ugyanarra a programozási nyelvre fog gondolni.

    Ilyen alapon dobjunk el minden SQL adatkezelő izét, mert van nekünk ezer éve DBF-ünk, ez meg ugye (a neve is megmondja) DataBaseFile

    Ez egy rendkívül gyenge hasonlat, mert nem arról van szó, hogy a csv mellett létezik-e másik, más karaktert az adatok szeparálására használó formátum, hanem arról, hogy egy adott formátumnál milyen felépítést várunk el.

    A DBF file-oknak is van egy struktúrája és ha egy file nem követi ezeket a szabályokat, akkor a DBF-et kezelő alkalmazás nem tud vele mit kezdeni.

    Sajnos a csv-nél a hétköznapi értelmezés nem követi a technikai értelmezést és már láttam olyat, amikor ez komoly gondokat okozott 2 rendszer közötti kommunikációban.
    Mutasd a teljes hozzászólást!
  • Az adott kérdésre már kaptál választ, de maga a CSV feldolgozása nem triviális.
    A CSV formátum használ elválasztásra vesszőt, pontosvesszőt, valamint a stringeket körbeveheti idézőjellel. A számok formátuma is lehet eltérő a nyelvi beállítások függvényében.

    Ha esetleg kész megoldást keresel, akkor a CSV megnyitható oledb-vel, vagy gyorsabb megoldás lehet egy kész csomag, pl. ez:

    JoshClose/CsvHelper
    Hogy mi az elválasztó, azt is meg lehet neki adni:
    JoshClose/CsvHelper

    NuGet csomagban is elérhető.


    OleDb megoldási példa:

    OleDbConnection cn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\;Extended Properties=""Text;HDR=No;FMT=Delimited"""); OleDbCommand cmd = new OleDbCommand(@"SELECT * FROM d:\temp\combined.csv", cn); cn.Open(); string currentValue = string.Empty; using (TextWriter writer = new StreamWriter(@"D:\temp\combined3.csv", false)) { using (IDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { //Process each field here. } } }
    Mutasd a teljes hozzászólást!
  • A CSV formátum használ elválasztásra vesszőt, pontosvesszőt

    Pontosítsunk: a csv formátum vesszőt használ a mezők elválasztására, nem pontosvesszőt.
    Mutasd a teljes hozzászólást!
  • Ok, pontosítok. Olyan "szabvány", hogy CSV nincs. A CSV-re van egy ajánlás, az RFC 4180.

    A CSV kiterjesztésű fájl viszont lehet valódi CSV, ami teljesíti a fenti RFC-t (ami egy ajánlás, nem szabvány), illetve lehet DSV benne, ami Delimiter-Separated-Value rövidítése.

    Azaz egy *.csv-t vagy sikerül feldolgozni az RFC 4180 szerint, vagy ha nem, akkor pontosítani kell, hogy a rekordok mezőit elválasztó jel. Ami lehet pontosvessző, vessző, sőt, akár TAB is, valamint azt is specifikálni kell ez esetben, hogy hogyan történik az értékek eltárolása, amikben van delimiter, és ha az ilyeneket valami módon escape-eljük, akkor mi az escape karakter, ha valamiféle jelek közé tesszük, akkor mi az a jel (idézőjel, aposztróf), és ez esetben ezekkel a jelekkel a mezőben mit kezdünk, escape-eljük, vagy duplázzuk-e esetleg.

    Szóval nem egyszerű a téma, ha nem magát a csv-t vesszük, hanem a csv kiterjesztésű fájlokra akarunk feldolgozót írni. 

    Erre próbáltam rávilágítani. Sikertelenül ezek szerint.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd